澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站玩转python爬虫之爬取糗事

 

python 爬取糗事百科 gui小程序,python糗事

 

前言:有的时候候无聊看有个别搞笑的段落,糗事百科仍然个不错的网址,所以就想用Python来玩一下。也比较简单,就写出来分享一下。嘿嘿

 

环境:Python 2.7 win7

 

未来开端,展开糗事百科网址,先来分析。地址:

澳门新浦京娱乐场网站 1

 

 

诚如像这种都以文本的话,查看源代码就能够看来内容了。

 

澳门新浦京娱乐场网站 2

 

澳门新浦京娱乐场网站 3

 

 

业已得以看出都以在三个class 为content 的div里面,那样就很轻松了,直接上正则表达式来合作就好了。

 

<div.*?class="content">(.*?)</div>

 那样等会再代码里面就足以领到出来段子内容了,再来看一下分页。

澳门新浦京娱乐场网站 4

 

分页也很简短,很有规律,直接接上页数就行了。

OK  既然 都分析完了 那就径直上代码。

 

#-*- coding: UTF-8 -*-
# author : Corleone
from Tkinter import *
import urllib2,re

def load(page):
        url="http://www.qiushibaike.com/text/page/" str(page) "/?s=4937798"
        user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36"
        headers={'User-Agent':user_agent}
        res=urllib2.Request(url,headers = headers)
        html = urllib2.urlopen(res).read()
        reg=re.compile(r'<div.*?class="content">(.*?)</div>',re.S)
        duanzi=reg.findall(html)
        return duanzi
i=0
page=1
def get():
    if i==0:
        txtlist=load(page)
        page =1
    if i<20:
        txt.delete(1.0,END)
        txt.insert(1.0,txtlist[i].replace("","").replace("","").replace("</br>","").replace("n","").replace("<br/>",""))
        i =1
        global i
        global page
        global txtlist
    else:
        i=0

def main():
    root=Tk()   # 定义一个窗口
    root.title("Corleone") # 定义窗口标题
    root.geometry('500x500')  # 定义窗口大小
    b=Button(root,text="next",width=25,bg="red",command=get)  # 定义一个按钮
    b.pack(side=BOTTOM)  # 按钮的布局 放在窗口最下面
    global txt
    txt=Text(root,font=("黑体",20)) # 定义一个编辑界面
    txt.pack(expand=YES,fill=BOTH)  # 编辑界面布局 随窗口大小而自动改变
    root.mainloop()   # 让窗口一直在屏幕上显示出来 


main()

 

那边运用了Python自带的图形化分界面库 Tkinter 来做gui分界面。一页大约贰12个段落 next 开关 下贰个 看完了 就翻页。

 

澳门新浦京娱乐场网站 5

 

 

嘿嘿,这样就能够直接看了。OK 好了  这篇作品也很轻易,没啥手艺含量,莫见怪,代码都以自家在此之前写的,未来照旧能用,就发出来了 : )

 

爬取糗事百科 gui小程序,python糗事 前言:有的时候候无聊看有的滑稽的段落,糗事百科还是个不利的网址,所以就想用Python来玩一下。也...

本篇教程内容完全针对初学者,如若您须求更进级一点的知识,本篇大概给您的扶持特别少于。

玩转python爬虫之爬取糗事百科段子,python糗事

世家好,后面入门已经说了那么多基础知识了,下边我们做多少个实战项目来挑衅一下啊。那么本次为大家带来,Python爬取糗事百科的小段子的例子。

先是,糗事百科我们都听别人说过吗?糗友们发的滑稽的段子一抓一大把,这一次大家品尝一下用爬虫把她们抓取下来。
本篇目标

  • 抓取糗事百科火爆段子
  • 过滤带有图片的段子
  • 福寿康宁每按叁遍回车展现多个段落的发布时间,发表人,段子内容,点赞数。

糗事百科是不须求报到的,所以也没必要用到Cookie,别的糗事百科有的段落是附图的,我们把图抓下来图片不低价呈现,那么大家就尝试过滤掉有图的段子吧。

好,今后大家尝试抓取一下糗事百科的紧俏段子吧,每按下二遍回车我们浮现贰个段落。

1.规定U奔驰M级L并抓取页面代码

先是大家规定好页面的U中华VL是 ,个中最终二个数字1表示页数,大家能够流传分裂的值来收获某一页的段落内容。

大家开端营造如下的代码来打字与印刷页面代码内容试试看,先构造最中心的页面抓取措施,看看会不会马到成功

# -*- coding:utf-8 -*-
import urllib
import urllib2


page = 1
url = 'http://www.qiushibaike.com/hot/page/'   str(page)
try:
  request = urllib2.Request(url)
  response = urllib2.urlopen(request)
  print response.read()
except urllib2.URLError, e:
  if hasattr(e,"code"):
    print e.code
  if hasattr(e,"reason"):
    print e.reason

运营程序,哦不,它以致报错了,真是时运不济,命途多舛啊

line 373, in _read_status
 raise BadStatusLine(line)
httplib.BadStatusLine: ''

行吗,应该是headers验证的标题,大家加多贰个headers验证试试看吗,将代码修改如下

# -*- coding:utf-8 -*-
import urllib
import urllib2

page = 1
url = 'http://www.qiushibaike.com/hot/page/'   str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
try:
  request = urllib2.Request(url,headers = headers)
  response = urllib2.urlopen(request)
  print response.read()
except urllib2.URLError, e:
  if hasattr(e,"code"):
    print e.code
  if hasattr(e,"reason"):
    print e.reason

哈哈哈,本次运转终张静常了,打字与印刷出了第一页的HTML代码,大家能够运转下代码试试看。在此处运维结果太长就不贴了。

2.提取某一页的富有段子

好,获取了HTML代码之后,大家初阶剖析哪些得到某一页的具有段子。

先是大家核查成分看一下,按浏览器的F12,截图如下

澳门新浦京娱乐场网站 6

小编们能够看看,每二个段子都是<div class=”article block untagged mb15″ id=”…”>…</div>包裹的开始和结果。

未来我们想赢得发表人,发布日期,段子内容,以及点赞的个数。不过其余注意的是,段子有个别是带图片的,假诺大家想在调节台展现图片是不现实的,所以大家一向把带有图片的段落给它剔除掉,只保留仅含文本的段子。

所以大家进入如下正则表达式来合作一下,用到的办法是 re.findall 是搜索全数般配的内容。方法的用法实际情况能够看前边说的正则表明式的牵线。

好,我们的正则表明式匹配语句书写如下,在原先的基础上平添如下代码

content = response.read().decode('utf-8')
pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?' 
             'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
  print item[0],item[1],item[2],item[3],item[4]

于今正则表达式在此间稍作表达

1).*? 是一个定位的陪衬,.和*代表可以同盟任意Infiniti多少个字符,加上?表示使用非贪婪格局举办相配,也便是大家会尽可能短地做合营,未来我们还有或许会大量用到 .*? 的搭配。

2)(.*?)代表一个分组,在那些正则表达式中大家合作了多少个分组,在前面包车型客车遍历item中,item[0]就代表首先个(.*?)所替代的剧情,item[1]就象征第1个(.*?)所代替的开始和结果,就那样推算。

3)re.S 标志代表在极其时为点任性相称方式,点 . 也足以代表换行符。

如此那般我们就获取了公布人,公布时间,发表内容,附加图片以及点赞数。

在这里注意一下,大家要收获的剧情一经是带有图片,直接出口出来相比繁琐,所以那边大家只获得不带图片的段落就好了。

故而,在这里我们就须要对带图片的段子举行过滤。

我们能够发掘,带有图片的段子会蕴藏类似上边的代码,而不带图片的则并未有,所以,大家的正则表明式的item[3]就算获得了上边包车型客车剧情,假设不带图片,item[3]收获的原委正是空。

<div class="thumb">

<a href="/article/112061287?list=hot&s=4794990" target="_blank">
<img src="http://www.bkjia.com/uploads/allimg/160220/001F06094-1.jpg" alt="但他们依然乐观">
</a>

</div>

进而大家只必要看清item[3]中是还是不是富含img标签就足以了。

好,大家再把上述代码中的for循环改为下边包车型地铁样子

for item in items:
    haveImg = re.search("img",item[3])
    if not haveImg:
      print item[0],item[1],item[2],item[4]

后天,全部的代码如下

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re

page = 1
url = 'http://www.qiushibaike.com/hot/page/'   str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
try:
  request = urllib2.Request(url,headers = headers)
  response = urllib2.urlopen(request)
  content = response.read().decode('utf-8')
  pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?' 
             'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
  items = re.findall(pattern,content)
  for item in items:
    haveImg = re.search("img",item[3])
    if not haveImg:
      print item[0],item[1],item[2],item[4]
except urllib2.URLError, e:
  if hasattr(e,"code"):
    print e.code
  if hasattr(e,"reason"):
    print e.reason

运维一下看下效果

澳门新浦京娱乐场网站 7

恩,带有图片的段子已经被剔除啦。是否很开森?

3.周到交互,设计面向对象情势

好啊,今后最大旨的片段大家已经产生啦,剩下的就是修一上面边角角的事物,大家想达到的目标是:

按下回车,读取二个段落,展现出段子的宣布人,发布日期,内容以及点赞个数。

别的我们必要统一希图面向对象形式,引进类和章程,将代码做一下优化和包裹,最终,大家的代码如下所示

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import time

#糗事百科爬虫类
class QSBK:

  #初始化方法,定义一些变量
  def __init__(self):
    self.pageIndex = 1
    self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    #初始化headers
    self.headers = { 'User-Agent' : self.user_agent }
    #存放段子的变量,每一个元素是每一页的段子们
    self.stories = []
    #存放程序是否继续运行的变量
    self.enable = False
  #传入某一页的索引获得页面代码
  def getPage(self,pageIndex):
    try:
      url = 'http://www.qiushibaike.com/hot/page/'   str(pageIndex)
      #构建请求的request
      request = urllib2.Request(url,headers = self.headers)
      #利用urlopen获取页面代码
      response = urllib2.urlopen(request)
      #将页面转化为UTF-8编码
      pageCode = response.read().decode('utf-8')
      return pageCode

    except urllib2.URLError, e:
      if hasattr(e,"reason"):
        print u"连接糗事百科失败,错误原因",e.reason
        return None


  #传入某一页代码,返回本页不带图片的段子列表
  def getPageItems(self,pageIndex):
    pageCode = self.getPage(pageIndex)
    if not pageCode:
      print "页面加载失败...."
      return None
    pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?' 
             'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
    items = re.findall(pattern,pageCode)
    #用来存储每页的段子们
    pageStories = []
    #遍历正则表达式匹配的信息
    for item in items:
      #是否含有图片
      haveImg = re.search("img",item[3])
      #如果不含有图片,把它加入list中
      if not haveImg:
        replaceBR = re.compile('<br/>')
        text = re.sub(replaceBR,"n",item[1])
        #item[0]是一个段子的发布者,item[1]是内容,item[2]是发布时间,item[4]是点赞数
        pageStories.append([item[0].strip(),text.strip(),item[2].strip(),item[4].strip()])
    return pageStories

  #加载并提取页面的内容,加入到列表中
  def loadPage(self):
    #如果当前未看的页数少于2页,则加载新一页
    if self.enable == True:
      if len(self.stories) < 2:
        #获取新一页
        pageStories = self.getPageItems(self.pageIndex)
        #将该页的段子存放到全局list中
        if pageStories:
          self.stories.append(pageStories)
          #获取完之后页码索引加一,表示下次读取下一页
          self.pageIndex  = 1

  #调用该方法,每次敲回车打印输出一个段子
  def getOneStory(self,pageStories,page):
    #遍历一页的段子
    for story in pageStories:
      #等待用户输入
      input = raw_input()
      #每当输入回车一次,判断一下是否要加载新页面
      self.loadPage()
      #如果输入Q则程序结束
      if input == "Q":
        self.enable = False
        return
      print u"第%d页t发布人:%st发布时间:%st赞:%sn%s" %(page,story[0],story[2],story[3],story[1])

  #开始方法
  def start(self):
    print u"正在读取糗事百科,按回车查看新段子,Q退出"
    #使变量为True,程序可以正常运行
    self.enable = True
    #先加载一页内容
    self.loadPage()
    #局部变量,控制当前读到了第几页
    nowPage = 0
    while self.enable:
      if len(self.stories)>0:
        #从全局list中获取一页的段子
        pageStories = self.stories[0]
        #当前读到的页数加一
        nowPage  = 1
        #将全局list中第一个元素删除,因为已经取出
        del self.stories[0]
        #输出该页的段子
        self.getOneStory(pageStories,nowPage)


spider = QSBK()
spider.start()

好啊,大家来测量试验一下呢,点一下回车会输出贰个段落,饱含发表人,揭橥时间,段子内容以及点赞数,是否感觉爽爆了!

大家率先个爬虫实战项目介绍到此地,希望大家爱怜得舍不得放手。

一、前言


俗话说,上班时间是厂家的,下班了时光才是本身的。搞点事情,写个爬虫程序,每日按时爬取点段子,看着友好爬的段子,也是一种乐趣。

 澳门新浦京娱乐场网站 8

 

序言:有的时候候无聊看一些滑稽的段子,糗事百科照旧个科学的网址,所以就想用Python来玩一下。也相比简单,就写出来分享一下。嘿嘿

先是断定代码境况,大家利用python来拓展爬虫的开采。在这里自身利用的版本是python3.5。这么些课程应该适用于具有python3.x版本, python2.x只怕做轻便的退换就能够直接运营。

您也许感兴趣的篇章:

  • python模拟和讯腾讯网登入作用(新浪和讯爬虫)
  • Python爬虫框架Scrapy安装使用手续
  • 行使Python编写轻便互连网爬虫抓取录像下载能源
  • 零基础写python爬虫之使用urllib2组件抓取网页内容
  • 零基础写python爬虫之urllib2使用指南
  • 零基础写python爬虫之神器正则表明式
  • 零基础写python爬虫之爬虫编写全记录
  • Python完成抓取页面上链接的简约爬虫分享
  • python编写爬虫小程序
  • 基python实现二十多线程网页爬虫

大家好,前边入门已经说了那么多基础知识了,上面大家做多少个实战项目来挑衅一下啊。那么...

二、Python爬取嗅事百科段子

 

本次教程中我们要用到的模块是requests模块。若无安装requests模块的同学必要先安装一下。

1.鲜明爬取的靶子网页

先是大家要断定对象,本次爬取的是糗事百科文字模块的段子。

(糗事百科)->剖判指标(战术:url格式(范围)、数据格式、网页编码)->编写代码->实施爬虫

 

环境:Python 2.7 win7

Mac端的同学先张开terminal,Windows端的同桌能够按下'win r'后调出"运行",然后输入cmd伸开命令提示行。

2.深入分析爬取的靶子网页

 段子链接:

做客链接能够看到如下的页面,二个红框代表三个段子内容,也正是对应html源码的二个div浮层。页面布局采用分页的方法,每页显示25条,总共13页。点击页码大概"下一页"会跳转到相应页面。Chrome浏览器F12足以看到,每页内容都以同台加载的,况且哀求次数比较多,明显无法选择直接模拟需要的措施,这里运用的爬取战术是Python Selenium,每获得和深入分析完一页的段落,点击 "下一页" 跳转到对应页码页继续解析,直至分析并记录全体的段子。

澳门新浦京娱乐场网站 9

 

Chrome F12翻看Network模块,看到乞请密密麻麻的,下载种种document、script js脚本、stylesheet样式,图片jpeg、png等。

澳门新浦京娱乐场网站 10

 

有个状态须要留神,当四个段落内容字数太多,会被截断,出现省略号“...”和"查看全文"的跳转链接,为了拿走完整的段落音讯,需求增加多二个手续,央浼段子的链接,再截取里面包车型大巴全体内容。

 澳门新浦京娱乐场网站 11

澳门新浦京娱乐场网站 12

 

 

澳门新浦京娱乐场网站 13按下win r澳门新浦京娱乐场网站 14打开cmd澳门新浦京娱乐场网站 15打开terminal

 3.编写代码

下载网页内容,作者利用python requests第三方库,发起GET乞求方式。 

澳门新浦京娱乐场网站 16澳门新浦京娱乐场网站 17

 1 def do_get_request(self, url, headers=None, timeout=3, is_return_text=True, num_retries=2):
 2     if url is None:
 3         return None
 4     print('Downloading:', url)
 5     if headers is None:  # 默认请求头
 6         headers = {
 7             'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
 8     response = None
 9     try:
10         response = requests.get(url, headers=headers, timeout=timeout)
11 
12         response.raise_for_status()  # a 4XX client error or 5XX server error response,raise requests.exceptions.HTTPError
13         if response.status_code == requests.codes.ok:
14             if is_return_text:
15                 html = response.text
16             else:
17                 html = response.json()
18         else:
19             html = None
20     except requests.Timeout as err:
21         print('Downloading Timeout:', err.args)
22         html = None
23     except requests.HTTPError as err:
24         print('Downloading HTTP Error,msg:{0}'.format(err.args))
25         html = None
26         if num_retries > 0:
27             if 500 <= response.status_code < 600:
28                 return self.do_get_request(url, headers=headers, num_retries=num_retries - 1)  # 服务器错误,导致请求失败,默认重试2次
29     except requests.ConnectionError as err:
30         print('Downloading Connection Error:', err.args)
31         html = None
32 
33     return html

View Code

 

剖析网页内容,笔者使用python lxml第三方库和python的re标准库,在分析从前,使用lxml的lxml的Cleaner清理器,把多余的空行、注释,脚本和样式等掌握,再经过re.sub(pattern, string, flags)替换部分标签和字符串<br>和n空行符,那样技能保障lxml.html.

_Element的text属性能够获得完整的段落内容(就算段子中有<br>,text属性只会取<br>前有个别的文字)。cssselect.CSSSelector()通过CSS选择器#content-left获取其下有所的div,再使用e.find()和e.findall()的xpath定位格局分别收获段子的投票的数量、商量数、

链接地址和剧情文本。

澳门新浦京娱乐场网站 18澳门新浦京娱乐场网站 19

 1 def duanzi_scrapter(html_doc, page_num=1):
 2     html_after_cleaner = cleaner.clean_html(html_doc)
 3     # 去除段子内容中的<br>
 4     pattern = re.compile('<br>|n')
 5     html_after_cleaner = re.sub(pattern, '', html_after_cleaner)
 6     document = etree.fromstring(html_after_cleaner, parser)
 7     print('正在解析第%s页段子...' % str(page_num))
 8     try:
 9         sel = cssselect.CSSSelector('#content-left > div')
10         for e in sel(document):
11 
12             try:
13                 # a content  获取段子信息
14                 a = e.find('.//a[@class="contentHerf"]')
15                 a_href = a.attrib['href']  # 格式/article/105323928
16                 spans = e.findall('.//a[@class="contentHerf"]/div/span')
17                 if len(spans) > 1:  # 出现“查看全文”
18                     urls.add_new_url(a_href)  # 保存段子链接
19                 else:
20                     duanzi_info = {}
21                     duanzi_info['dz_url'] = 'https://www.qiushibaike.com'   a_href  # 段子链接地址
22                     duanzi_info['dzContent'] = spans[0].text  # 段子内容
23 
24                     # div stats
25                     spans = e.findall('.//div[@class="stats"]/span')
26                     for span in spans:
27                         i = span.find('.//i')
28                         if span.get('class') == 'stats-vote':
29                             duanzi_info['vote_num'] = i.text  # 投票数
30                         elif span.get('class') == 'stats-comments':  # 评论数
31                             duanzi_info['comment_num'] = i.text
32                     collect_data(duanzi_info)
33 
34             except Exception as err:
35                 print('提取段子异常,进入下一循环')
36                 continue
37         print('解析第%s页段子结束' % str(page_num))
38         next_page(page_num   1)  # 进入下一页
39     except TimeoutException as err:
40         print('解析网页出错:', err.args)
41         return next_page(page_num   1)   # 捕获异常,直接进入下一页

View Code

 

下载并深入分析因字数过长截断而不能够获得完整段子内容的段落链接页面,获取段子的投票的数量、商量数、链接地址和内容文本。

东施效颦单击“下一页”按键,跳转到下一页。

澳门新浦京娱乐场网站 20澳门新浦京娱乐场网站 21

 1 def next_page(page_num_input):
 2     # print('当前是第%d页' % (page_num_input))  # 首页下标为0,依次累加
 3     if page_num_input > 1:  # 超出最大页码,直接返回
 4         print('超过最大页码,返回')
 5         return
 6     try:
 7         # 定位并单击"下一页",跳转到下一页
 8         submit = wait.until(
 9             EC.element_to_be_clickable((By.XPATH, '//*[@id="content-left"]/ul/li/a/span[@class="next"]'))
10         )
11         submit.click()
12         time.sleep(5)  # 注意:等待页面加载完成
13         # 定位当前页码
14         # current = wait.until(
15         #     EC.presence_of_element_located((By.XPATH, '//*[@id="content-left"]/ul/li/span[@class="current"]'))
16         # )
17         # print('当前页码是%s' % current.text)  # 打印当前页码
18 
19         html = browser.page_source
20         duanzi_scrapter(html, page_num_input)  # 解析段子
21     except TimeoutException as err:
22         print('翻页出错:', err.args)

View Code

 

保存段子消息到Excel文件

澳门新浦京娱乐场网站 22澳门新浦京娱乐场网站 23

 1 from openpyxl import Workbook
 2  
 3  
 4  class excelManager:
 5      def __init__(self, excel_name):
 6          self.workBook = Workbook()
 7          self.workSheet = self.workBook.create_sheet('duanzi')
 8          self.workSheet.append(['投票数', '评论数', '链接地址', '段子内容'])
 9          self.excelName = excel_name
10  
11      def write_to_excel(self, content):
12          try:
13              for row in content:
14                  self.workSheet.append([row['vote_num'], row['comment_num'], row['dz_url'], row['dzContent']])
15              self.workBook.save(self.excelName)  # 保存段子信息到Excel文件
16          except Exception as arr:
17              print('write to excel error', arr.args)
18  
19      def close_excel(self):
20          self.workBook.close()

View Code

最近始于,张开糗事百科网址,先来剖析。地址:

开荒未来输入

 

澳门新浦京娱乐场网站 24

pip install requests

4.施行爬虫

爬虫跑起来了,一页一页地去爬取段子信息,并保留到集合中,最终通过get_duanzi_info()方法赢得段子的投票的数量、商量数,链接地址和内容并保留到Excel文件中。

爬虫程序运维截图:

澳门新浦京娱乐场网站 25

 

 Excel文件截图:

 澳门新浦京娱乐场网站 26

 

来设置那些模块。

三、Python爬取嗅事百科段子总计


  糗事百科页面加载未有选拔ajax的异步格局,选拔使用Python Selenium格局是相比客观的。一页一页地往下排,爬完一页再下一页,直至爬完最大的页数。此次页面解析全部应用Python lxml格局,解析质量方面lxml较BeautifulSoup高,然则认为使用未有像BeautifulSoup简单易用,还会有通过xpath定位成分的时候花了广大时光,也暴表露本人对xpath定位格局不太熟习,前期要求多花点时间。爬取效用方面,这里运用的是单进程的秘诀,早先时期版本想利用三十二线程的议程,在忘寝废食爬取功能的还要,会多学学些网址防爬虫的知识,包涵浏览器代理,HTTP伏乞头,同一域名访问时间距离等。

 

 

requests是贰个特别便利的模块。恐怕您会看出有广大的代码在运用urllib的模块,这些课程未有行使那么些模块的由来是因为它们相比较requests来说都相比较复杂,作为一个初大家,大家从不须求一味的攀高。往往比工具更主要的是思虑,我们学习的基本点是考虑,而非工具本人。真正的收获,一定是您忘掉您的全数所学之后剩下的事物。

四、后语


  最后要喜庆下,终究成功把糗事百科的段子爬取下来了。本次能够成功爬取段子,Selenium PhantomJS,lxml和requests功不可没,通过本次实战,小编对lxml的html成分定位和lxml API有越来越深远的精通,后续会越来越尖锐学习。期待后一次实战。

相似像这种都以文件的话,查看源代码就足以见见内容了。

好了大家不说废话了,初叶踏入正题吧!

 

咱俩先从轻易的地点初叶——爬取百度的首页。

澳门新浦京娱乐场网站 27

张开python,输入上面包车型大巴代码

 

import requestsr = requests.get('https://baidu.com')print

澳门新浦京娱乐场网站 28

你看,百度的分界面我们就早就获得了

 

澳门新浦京娱乐场网站 29百度的网页文件

 

想必有个别同学一开首那样爬会收获贰个timeout的失实。假如出现了那样的情状,正是网址疑心是三个机器人在做客本人,所以作出了必然的掣肘。

早就能够看来都以在二个class 为content 的div里面,那样就非常粗大略了,间接上正则表明式来同盟就好了。

那如何做呢?未有提到,大家略微修改一下我们的代码,改成

 

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('https://baidu.com', headers = headers)
<div.*?class="content">(.*?)</div>

headers的意趣就是报告网址,大家是二个寻常化的浏览器在给它发送新闻,请它给大家准确的音讯。

 那样等会再代码里面就足以领收取来段子内容了,再来看一下分页。

同一的,比比较多网址没有必要登录,直接就足以访问当中的原委,比如糗事百科、煎蛋网等等都能够直接爬取下来。

澳门新浦京娱乐场网站 30

哪些,是或不是有一丝小小的引以自豪?

 

你大概就能够问了,网页文件里面有那么多的无用新闻,咱们要怎么把它提抽出来啊?

分页也很轻便,很有规律,直接接上页数就行了。

其有的时候候我们平常有二种做法,一种是正则表明式,一种是因而网页的布局对剧情提取。

OK  既然 都深入分析完了 那就一向上代码。

因为正则表明式相较前者尤为复杂,对生手并不充裕融洽。所以我们这一次的爬虫使用直接对网页的故事情节开始展览领取的主意来获取信息。借使您很想打听正则说明式的行使方法,你能够期待本课程的存在延续更新大概崔庆才先生博客中的正则表明式教程。

 

Beautiful soup是另一个python的模块,大家将用这些模块来分解网页的构造,并对里面包车型大巴内容进行提取。

#-*- coding: UTF-8 -*-
# author : Corleone
from Tkinter import *
import urllib2,re

def load(page):
        url="http://www.qiushibaike.com/text/page/" str(page) "/?s=4937798"
        user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36"
        headers={'User-Agent':user_agent}
        res=urllib2.Request(url,headers = headers)
        html = urllib2.urlopen(res).read()
        reg=re.compile(r'<div.*?class="content">(.*?)</div>',re.S)
        duanzi=reg.findall(html)
        return duanzi
i=0
page=1
def get():
    if i==0:
        txtlist=load(page)
        page =1
    if i<20:
        txt.delete(1.0,END)
        txt.insert(1.0,txtlist[i].replace("","").replace("","").replace("</br>","").replace("n","").replace("<br/>",""))
        i =1
        global i
        global page
        global txtlist
    else:
        i=0

def main():
    root=Tk()   # 定义一个窗口
    root.title("Corleone") # 定义窗口标题
    root.geometry('500x500')  # 定义窗口大小
    b=Button(root,text="next",width=25,bg="red",command=get)  # 定义一个按钮
    b.pack(side=BOTTOM)  # 按钮的布局 放在窗口最下面
    global txt
    txt=Text(root,font=(u"黑体",20)) # 定义一个编辑界面
    txt.pack(expand=YES,fill=BOTH)  # 编辑界面布局 随窗口大小而自动改变
    root.mainloop()   # 让窗口一直在屏幕上显示出来 


main()

一样的,Beautiful soup是一个第三方模块,大家需求使用

 

pip install beautifulsoup4

此地运用了Python自带的图片化分界面库 Tkinter 来做gui分界面。一页大致十八个段子 next 按键 下二个 看完了 就翻页。

来对模块进行设置。

 

但是那还非常不足,Beautiful soup须求lxml包对文件进行处理,所以在装置完bs4之后你还亟需安装lxml包:

澳门新浦京娱乐场网站 31

pip install lxml

 

在进一步讲Beautiful soup的接纳此前,我们先深入分析一下要爬取的网页的结构,那样大家本领越来越可行的对准网页的协会对网页的内容开始展览提取。

 

此地大家以糗事百科为例进行批注。

哈哈,那样就会一向看了。OK 好了  那篇小说也极粗略,没啥手艺含量,莫见怪,代码都以自己事先写的,今后依旧能用,就发出来了 : )

首先件事照旧是我们先把它的页面爬取下来,也正是

 

import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('http://www.qiushibaike.com', headers = headers)content = r.textprint

能够看到网页的剧情已经被我们积存到了content变量中,打字与印刷出来是那样的:

澳门新浦京娱乐场网站 32content

接下去大家来剖析网址的构造。

或许你也意识了,直接动用大家打印出来的结果分析起来非常老魔难。所以大家利用进一步高效的工具——开采者工具(Developer tools)来打开解析。

平时来讲任何一个浏览器都有开拓者工具,这里大家以Chrome为例。

Mac端在开荒糗事百科之后按下option command I, Windows端直接按下F12即可。

澳门新浦京娱乐场网站 33Developer tools

能够看来,只要我们鼠标移到对应的竹签上,chrome就能够帮大家把标签里面含有的网页内容高亮出来。

咱俩要的故事情节非常粗略,就是在那之中的段落。所以大家右键点击段子所在的岗位,点击审核成分,chrome就能够自行找到该内容对应的标签。

澳门新浦京娱乐场网站 34审查批准成分

能够看来咱们要的段落的源委就储存在这些名叫span的标签中。

澳门新浦京娱乐场网站 35段子内容

我们再往上查找,可以见到<span>标签是属于一个名称为<div >的竹签的。继续往上大家得以看来多少个叫作<div id =....>的价签。

澳门新浦京娱乐场网站 36<div id =....>

点击旁边的小三角,合併标签里面包车型大巴源委之后我们能够见见有特别多那样格式的价签。何况每三个标签都对应了多个段落。

澳门新浦京娱乐场网站 37有比相当多那样的价签

于是很引人瞩目,我们只要把如此的标签都领到出来,大家就足以拿走糗事百科中的段子了。

进方今后大家鲜明了体系化——把装有class为article block untagged mb15的div标签找到,然后拿走里面span标签的开始和结果。那正是我们要找的段落了。

那要怎么写啊?

第一大家把大家须求的内容转变成Beautiful soup中。

# 引入Beautiful Soup包from bs4 import BeautifulSoup # 把刚刚保存在content中的文件放入Beautiful Soup中soup = BeautifulSoup(content, 'lxml') 

你大概会奇异前面包车型大巴'lxml'是如何意思。其实那是因为咱们的content是三个字符串数据,它并不是网页文件。所以这里大家告诉Beautiful soup说您就把她当二个网页文件来拍卖就行。

到近期结束, 大家早已把网页的始末放入了Beautiful soup中,接下去就是施展Beautiful soup的法力,把网页分成一块块的开始和结果了。

只顾,在进展下一步事先你应有认可一下脚下大家的代码是如此的:

import requestsfrom bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('http://www.qiushibaike.com', headers = headers)content = r.textsoup = BeautifulSoup(content, 'lxml')

还记得吗?大家深入分析的结果是说有着的段落都在网页中class为article block untagged mb15的div标签中的span标签中。看起来好像有一点复杂,没事,我们一步一步来做。

第一大家解释出富有class为article block untagged mb15标签:

divs = soup.find_all(class_ = 'article block untagged mb15')

咱俩得以打字与印刷出divs看看是什么样子的。

print

澳门新浦京娱乐场网站 38divs

能够看看,全体div的标签都曾经储存在divs里面了。

在进展下一步事先大家再确认一下,这年你的代码应该是以此样子的:

import requestsfrom bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('http://www.qiushibaike.com', headers = headers)content = r.textsoup = BeautifulSoup(r.text, 'lxml')divs = soup.find_all(class_ = 'article block untagged mb15')print

接下去大家要做的事情正是把这一个div里面包车型客车span都收取来。

咱俩先把最终一行去掉,防止不供给的打字与印刷。然后提收取每种div里面的span

for div in divs: joke = div.span.get_text() print print

专注,这一年你的代码看起来应当是那般的:

import requestsfrom bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('http://www.qiushibaike.com', headers = headers)content = r.textsoup = BeautifulSoup(r.text, 'lxml')divs = soup.find_all(class_ = 'article block untagged mb15')for div in divs: joke = div.span.get_text() print print

这段代码的意思正是把divs中的每一个div都抽取来(还记得呢,divs里面有全部的class为article block untagged mb15的div)。抽取来今后大家对它说,你把您里面叫做span的价签的文字都给自家呢。于是大家就把这么些中的调侃都放进了joke其中,并打字与印刷了出去。

运营一下顺序,能够见见你早就成功把糗事百科首页上边的具备段子爬下来了!

澳门新浦京娱乐场网站 39您成功了!

恭贺您已经成功入门了python的爬虫。你今后得以给和谐鼓起掌

爬虫并未那么难,对吗?

笔者们把打印的源委拉到最末尾,开采部分读不通的言语:

澳门新浦京娱乐场网站 40其三行不通晓在说怎么

咱俩回到糗事百科的首页看看

澳门新浦京娱乐场网站 41原来是有图表

原先是有图片,怪不得光看字看不懂。那大家的爬虫现在还无法爬下来图片,那有未有怎么着方法让这一个无缘无故的话都删掉呢?

自己想你也相应想到了,一样的,大家去剖判网页的结构,然后告诉python,借使存在带有图片的网页结构,大家就不打字与印刷那一个段子。

大家开垦开垦者工具。(你还记得快速键吗?)然后右键点击图片,核实成分。

澳门新浦京娱乐场网站 42澳门新浦京娱乐场网站玩转python爬虫之爬取糗事百科段子,爬取糗事百科。打开开荒者工具

小编们看看,图片的网页标签是img,所以大家借使在代码中检查测量试验div中是不是有img标签,大家是还是不是就领会是否要打字与印刷那条段子了啊?

别急,大家先看看把div里面包车型客车img都打字与印刷出来是何等样子的。

for div in divs: # 在这里我们找到所有的img标签,然后打印 print(div.find_all joke = div.span.get_text() print print

澳门新浦京娱乐场网站 43少了一些每一条里面都有图片

如上所述特别, 大家看到大约每一条里面都有图片。我们回去chrome再看看div里面包车型客车布局,原本图片不只段子里面包车型客车图样,还包罗了发帖人的头像,评论区的点赞Logo等等。

那看来独有是看是不是img标签来判定依然非常不足的,那大家就不得不再看看别的结构,看看有未有更使得的构造。

段子图片的img标签再往上找几层我们轻便察觉,它们都存在一个<div >的价签之下。而那么些从没图片的段落就未有<div >这几个标签。

为此您成功开掘了缓和的方法——只要找每一种总的div里面是否有<div >标签就知晓这几个段落里面是否包蕴图表了。

那我们一而再修改我们的大循环:

for div in divs: if div.find_all(class_ = 'thumb'): continue joke = div.span.get_text() print print

if div.find_all(class_ = 'thumb')的意趣正是反省div.find_all(class_ = 'thumb')中有未有找到class为thumb的竹签,如若找到了,那就注解大家不打字与印刷这一段,所以举行continuecontinue的意味就是跳到循环末尾,直接进去下一层循环,中间的代码都不要实践了,所以我们的代码最终看起来是如此的:

import requestsfrom bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}r = requests.get('http://www.qiushibaike.com', headers = headers)content = r.textsoup = BeautifulSoup(r.text, 'lxml')divs = soup.find_all(class_ = 'article block untagged mb15')for div in divs: if div.find_all(class_ = 'thumb'): continue joke = div.span.get_text() print print

运行一下,能够窥见大家早已已经看不到有图片的段子了。

澳门新浦京娱乐场网站 44老大的深透

恭贺您,你早就学会了什么去剖析网页的布局,那是非常重要的一步,学会深入分析的主意比学会任何工具都要有用。

而且你做的百般好!你以往能够去喝一杯咖啡,吃点饼干,安歇一下。

若是您精力还很精神,无妨思考一下,能还是无法把每一种段落的撰稿人,点赞数,研商数都领到出来啊?

到近些日子结束,大家已经打响的领取了糗事百科首页的段落。恐怕精力旺盛的同桌还成功提取了每条段子的小编、点赞数等等。

澳门新浦京娱乐场网站玩转python爬虫之爬取糗事百科段子,爬取糗事百科。见笑永世是不嫌多的~或然您以为只看一页的耻笑已经满意不断你了,那大家就来试试提取前四页的从头到尾的经过。

咱俩先点开糗事百科的第二页,看看和第一页有啥样两样。

澳门新浦京娱乐场网站 45网站爆发了扭转

能够见到网站爆发了变动。从http:qiushibaike.com成为了一长串的http://www.qiushibaike.com/8hr/page/2/?s=4969792。注意到网址中有/page/2/,page是页的意思,很有相当大可能率正是这一块在支配页码。

光猜显明极其,大家来试一试把2改成3会时有发生哪些。

澳门新浦京娱乐场网站 46其次页形成了第三页

其次页产生了第三页,那看来确实就是/page/之后的数字在调节页码。可是除了page之外,网站后边还跟着一串很奇怪的东西——?s=4969792,那那样一长串是在干什么吗?

这就和大家下一节要讲的GET和POST有关了。大家在进入下一节在此以前大约介绍一下。

在拜望糗事百科的时候大家的浏览器会给网址发送五个识别码,那一个识别码便是背后的那一串数字,说可瑞康(Karicare)直是你在访问它。

某种意义上讲这么的识别码也得以帮忙糗事百科深入分析用户习于旧贯,因为多少个识别码对应多少个用户,通过这么些识别码访谈糗事百科的原委的时候,糗事百科就了然你的用户作为。

当然,借使您换了一串数字,访谈也是能够正常实行的。譬如小编不管一改后边的那串数字,

澳门新浦京娱乐场网站 47澳门新浦京娱乐场网站,正规打开

网址依然好端端的出现了。那那几个s=1231421不怕浏览器在出殡和埋葬GET央浼的时候的叠合数据。换句话讲,正是浏览器在给网址说,麻烦您给笔者须臾间新式的嘲弄,要第二页的。对的,我要么刚刚的百般王老五。

那要是您改了背后的那串数字,就相当于给网址说,笔者实在是隔壁老王,不是刚刚的特别王老五。然而依然麻烦您把第二页的笑话给小编看一看。

故而你未来晓得了,GET便是浏览器在向网址索要网页新闻,在急需网页的还要也只怕会发送一些新闻给网址。

假诺大家删掉?s=xxxxx,能够见到网页如故会健康的加载。也正是在浏览器在出殡和埋葬GET央浼的时候从不增大别的的新闻。

还记得大家最开首的靶子吧——获得糗事百科前四页的段落。所以这年大家只必要通过轮回对网址进行一个改动,分别访谈糗事百科四遍,提取肆回就能够了。

知道了办法,大家未来就用代码来促成它。

在这里自个儿刚毅提议你暂停一下,不要往下翻。试试自身写能还是不能够把代码写出来,若是实际不行再看看上边包车型客车代码。

编制程序是一门入手的方式,金橘独有和煦尝尝才掌握是怎么着味道~

import requestsfrom bs4 import BeautifulSoupheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}base_url = 'http://www.qiushibaike.com/8hr/page/' # 设定一个网址不变的部分,然后我们只要每次在这个后面加数字就可以了for num in range: # 设置循环,让num分别等于1-10 print('第{}页'.format r = requests.get(base_url   str, headers = headers) #这里对网址进行一个修改 #剩下的部分都是和原来的代码一样 content = r.text soup = BeautifulSoup(r.text, 'lxml') divs = soup.find_all(class_ = 'article block untagged mb15') for div in divs: if div.find_all(class_ = 'thumb'): continue joke = div.span.get_text() print print

运营一下,能够看到你早就成功的得到了前四页的耻笑。

澳门新浦京娱乐场网站 48您又打响了!

导航

本篇教程代码文件已经上传Github,点击这里寻访

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站玩转python爬虫之爬取糗事