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库等)实现爬取功能。