爬取糗事百科的段子Demo

1.我们要做什么?

爬取糗事百科的段子,并打印输出在屏幕上。

2.怎么做?

(1)获取网页的内容:目的网址为https://www.qiushibaike.com/text/,该网址为糗事百科文本段子的部分。右键点击查看源代码,截图为:


获取网页内容的代码如下:

url = 'https://www.qiushibaike.com/text/'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
request = urllib.request.Request(url, headers = headers)
response = urllib.request.urlopen(request)
content = response.read()

这里urllib.request的Request方法产生了一个访问指定url的request请求对象(注意这里添加headers头部信息是手动添加代理,防止网页拒绝访问。),再用urlopen()方法得到一个response对象,该对象包含了待爬取网页的内容,我们通过response对象的read()方法得到内容,然后进一步处理。

注意:在python3中,urllib和urllib2合并成一个urllib包,python2中的urllib2.urlopen()方法也变成了urllib.request.urlopen()方法,其它方法类似。

(2)根据需要爬取的标签设计正则表达式模式:可以看到,所有的段子都保存在<div class="article block untagged mb15" id='...'>标签内。我们获取每个段子的发布者,段子内容,点赞个数。

匹配内容的正则表达式样式为:

pattern = '<h2>(.*?)</h2>.*?<div.*?content">.*?<span>(.*?)</span>.*?vote">.*?number">(.*?)</i>'

整体思想是:把整个网页内容看成是一个巨大巨大的字符串,通过正则表达式,找出想要的内容。

上述pattern中,.*?是一个常见的搭配,.*表示匹配任意无限多个字符,?表示非贪婪匹配,即"有就行",因为网页中相同的标签有很多,而我们需要的是最相近的,因此这种匹配方式是必要的。(.*?)代表一个分组,上述pattern分了三组,最终输出的是(.*?)代表的内容。

注意:匹配到所需内容的pattern是不唯一的,能达到效果即可;糗事百科的网页样式经常会变,爬取时先查看其源代码,再去设计样式。

(3)匹配需要的内容并输出

items = re.findall(pattern, content)
t通过re的findall()方法,找到所有的笑话,并打印输出。

3.整体代码:

import urllib.request
import re

url = 'https://www.qiushibaike.com/text/'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}
try:
    request = urllib.request.Request(url, headers = headers)
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    pattern = re.compile('<h2>(.*?)</h2>.*?<div.*?content">.*?'
                         + '<span>(.*?)</span>.*?vote">.*?'
                         + 'number">(.*?)</i>', re.S)
    items = re.findall(pattern, content)
    for item in items:
        print("发布者:" + item[0])
        print(item[1])
        print("点赞个数:" + item[2])
        print("---------------------")
except Exception as e:
    print(e)
注意:前面提到(.*?)代表一个分组,三个分组分别为发布者,内容和点赞数,对应item[0],item[1],item[2]。

4.运行效果图



5.至此,基本功能实现了,随后还可以做的工作有:

(1)更改一下输出的排版,使其更加整齐。

(2)改变一下url使其爬取整个糗事百科文字版块的内容。

(3)可以把爬取到的内容写在文件里而不是输出在控制台。

(4)可以使用其它的方法(request库,BeautifulSoup库等)实现爬取功能。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值