Python-爬虫——爬取糗事百科上面的段子(适用于有Python基础)

       Python语言在最近几年之间发展迅猛,比较喜欢用Python来写一些爬虫。Python爬虫因为有极其丰富和功能强大的库在爬虫领域占据领导地位,以下的文章将以一个新手的姿态来记录下用Python写爬虫的历程,也可以为想学习爬虫的人提供一个简单的教程。

 1,分析糗事百科的网页源代码。

 2,构建提取相应的正则表达式。

 3,写出算法来提取相应内容。

 4,遇到的一些问题和小窍门。

   对于糗事百科,我们提取的主要是两个部分,一个是“发帖人”另一个就是“发帖人的段子”。

       在网页里,我们需要找到“爱在天涯AA”还有以下的“段子”就是我们需要爬取的东西了。

1,分析糗事百科的网页源代码。

       网页源代码如下,我截取了一部分的的代码片段。

       在代码中,我们很清楚的看到“发帖人”和“段子”,相应的代码部分我们也看到了,更明白了它的结构,<h2>发帖人</h2>  ,<span>段子</span>。分析到这里就足够了!

 2,构建提取相应的正则表达式。  

       依据很简单的正则表达式规则,我们就可以得出他们的正则表达式:userpat='<h2>(.*?)</h2>'  , contentpat='<span>(.*?)</span>'

 3,写出算法来提取相应内容。

       相应的算法如下,通过for循环来不断的获取网页内容。

import re
import urllib.request
def getUserName(url,page):
    #模拟浏览器登陆
    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36")
    opener=urllib.request.build_opener()
    opener.addheaders=[headers]
    urllib.request.install_opener(opener)
    data=urllib.request.urlopen(url).read().decode("utf-8")
    userpat='<h2>(.*?)</h2>'#相应的正则表达式
    contentpat='<span>(.*?)</span>'
    usernamelist=re.compile(userpat,re.S).findall(data)#得到一个列表(关于发帖人的)
    contentlist=re.compile(contentpat,re.S).findall(data)#得到一个列表(关于段子的)
    x=1
    for username in usernamelist:
        print("用户"+str(page)+'-'+str(x)+"是:"+str(username))
        print(str(contentlist[x]))
        x+=1
for i in range(1,4):
    url="https://www.qiushibaike.com/8hr/page/"+str(i)#获取它的网页(从第一页到第三页)
    getUserName(url,i)
    print(str(i))

       最后爬下的结果如下:


 4,遇到的一些问题和小窍门。

       可能有一些心细的人会发现段子文本中存在一些不可去除的符号<br/>。


      解决方法有两种:一,完善它的正则表达式(能力有限,我还不会)。二,从抓取的data里面将<br/>换成""(用到了re.sub()函数)。我选择了第二种方法,实现起来比较简单。

      修改后的代码如下: 

import re
import urllib.request
def getUserName(url,page):
    #模拟浏览器登陆
    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36")
    opener=urllib.request.build_opener()
    opener.addheaders=[headers]
    urllib.request.install_opener(opener)
    data=urllib.request.urlopen(url).read().decode("utf-8")
    userpat='<h2>(.*?)</h2>'#相应的正则表达式
    contentpat='<span>(.*?)</span>'
    conpat='<br/>'#替代的正则表达式
    data=re.sub(conpat,"",data)#替换函数
    usernamelist=re.compile(userpat,re.S).findall(data)#得到一个列表(关于发帖人的)
    contentlist=re.compile(contentpat,re.S).findall(data)#得到一个列表(关于段子的)
    x=1
    for username in usernamelist:
        print("用户"+str(page)+'-'+str(x)+"是:"+str(username))
        print(str(contentlist[x]))
        x+=1
for i in range(1,4):
    url="https://www.qiushibaike.com/8hr/page/"+str(i)#获取它的网页(从第一页到第三页)
    getUserName(url,i)
    print(str(i))

最后亲测有效,比较好的解决了这个问题。



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值