实验目的:获取糗事百科网页上的段子
思路
1)分析各个页面间的网址规律,构造网址变量
对应的网址:https://www.qiushibaike.com/
接下来,对网址进行分析,此时我只获得了段子的第一个页面,往下拖动,可以看到段子还有很多页,如图所示
糗事百科.png那么,怎么样才能自动爬取第一页以外的其他页面呢?
单击“2”、“3”...."下一页",观察网址的变化。
鼠标点击“2”之后,发现网址由 https://www.qiushibaike.com/ 变为 https://www.qiushibaike.com/8hr/page/2/
继续点击“3”,发现网址变成了 https://www.qiushibaike.com/8hr/page/3/
觉得还不能得出规律的话可以继续往下点几页观察
可以发现,获取第几页是通过URL地址识别的,即通过GET请求的
通过GET请求获取下一页.png观察网址的变化,发现有个字段 page,“/”之后的数字对应就是页数,由此推测 page 字段后面的数字代表的是获取第几页的段子内容,将网址中的数字3 改成11 进行验证,即网址变为https://www.qiushibaike.com/8hr/page/11/,观察页面结果,可以看到页面展示的是第11页的段子内容
手工切换网址观察内容变化.png由此可以想到使用 for 循环实现,每页段子内容读取完后,数字(页数)加1,即自动切换到下一页
2)构建自定义函数,用来实现爬取网页上的段子,包括:用户昵称、段子内容
- 模拟浏览器访问,观察网页源代码,将用户昵称和段子内容的格式写成正则表达式
- 用正则表达式提取出用户昵称和段子内容(获取多少内容,即页数由自己决定)
- 通过 for 循环分别遍历用户昵称和段子内容
3)通过 for 循环获取各页URL链接,每页分别调用一个函数
具体实现代码如下:
# -*- coding: utf-8 -*-
# __author__ = 'Carina'
import re
import urllib.request
def getcontent(qsbkurl, page):
# 模拟成浏览器
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener 设为全局变量
urllib.request.install_opener(opener)
data = urllib.request.urlopen(qsbkurl).read().decode('utf-8')
# print(data)
# 构建对应用户提取的正则表达式
userpat = '<h2>*(.*?)</h2>'
# 构建段子内容提取的正则表达式
contentpat = '<div class="content">(.*?)</div>'
# 寻找出所有用户
userlist = re.compile(userpat, re.S).findall(data) # re.S表示使.匹配包括换行在内的所有字符
# print(userlist)
# 寻找出所有的内容
contestlist = re.compile(contentpat, re.S).findall(data)
# print(contestlist)
x = 1
# 通过for循环遍历段子内容并将内容分别付给对应的变量
for content in contestlist:
content = content.replace("\n", "") # 替换换行符
content = content.replace("<span>", "") #可根据需求增减替换字符
content = content.replace("</span>", "")
# 用字符串作为变量名,先将对应字符赋给一个变量
neilong = "content" + str(x)
# 通过exec()函数实现用字符串作为变量名并赋值
exec(neilong + '=content')
x += 1
y = 1
# 通过for循环遍历用户,并输出该用户对应的内容
for user in userlist:
user = user.replace("\n","")
neilong = "content" + str(y)
print("第" + str(page) + "页的用户是:" + user)
print("段子内容是:")
exec("print("+ neilong +")")
print("\n")
y += 1
# 分别获取各页的段子,通过for循环可以获取多页
for i in range(1, 4): # 爬取页数自己设定
qsbkurl = "https://www.qiushibaike.com/8hr/page/" + str(i)
getcontent(qsbkurl, i)
怎么定位用户昵称和段子内容?
网页鼠标右键---查看源代码,接着可根据页面上的昵称和内容去搜索(Ctrl+F),方便快读定位,由此可得出用户昵称从<h2>...</h2>标签去取,段子内容从<div class="content">.....</div>取,加以整理得出正则表达式
定位元素.png结合网页和输出结果,看到内容是一致的,数据爬取成功
第一页结果.png 第三页结果.png总结
通过爬虫进行自动化爬取,可以省下很多时间,比如要通过复制粘贴的方式,几百页的数据耗费的精力就非常大了,另外也有一些网站是不允许复制粘贴的,碰到时会很头疼,只能借助其他办法
采用爬虫的方式,也可以将数据取出来存到数据库方便使用
若糗事百科的网页代码结构发生了变化,那么代码中的URL网址和正则表达式都要进行相应的调整,否则无法爬取。
写给自己的话
学习爬虫,要学会写爬虫的这一套方法并灵活运用
(基本思路一致,具体细节具体分析)
网友评论