urllib网页数据抓取:get请求抓取小说数据
2023-01-08 本文已影响0人
fakeProgramer
【目标】本文使用urllib尝试获取某本小说前100章的源码数据
语言:python
包:urllib
本文仅做学习交流使用!!!
练习网站:
星门网
分析网站的请求要求、请求的结构等
- 谷歌浏览器登录网站,进入开发者模式(页面右键“检查”);
- 查找network下所有的请求信息,不难发现有个2072590.html的请求包含了小说正文的内容(Response信息);
- 查询该记录的请求信息(Request Headers),能够获取:
· 请求地址url(Request URL):
· 请求方式:GET请求
· 这是第一章的数据,按此方式检查第二章、第三章的请求,分析url地址发现只有最后2072590这个数字不同,即第二章(2072590+1),第三章(2072590+2)...以此类推。因此,我们可以构建一个range(100)的For循环,就能生成100个与章节对应的url请求网址。 - 接下来,查询该记录的请求头,看看要带哪些数据给请求网址才能获取到该信息。
图片3.png
需要带的数据好像有点多。经测试发现我们只把最后一个UA数据带上就能获取到正确响应,可能这个网站没什么反Pa措施。。因此构建本次的headers只用传入UA信息。 - 分析工作完毕,接下来分几步敲码:
· 使用for循环构建出不同的url请求地址;
· 使用urllib.request.Request()方法定制一个包含url和headers信息的请求对象;
· 对请求对象分别发送请求指令,获取response信息;
· 使用open()方法和编解码将每次响应回来的数据保存成新的html文件。
敲码时间
import urllib.request
import urllib.parse
for data in range(100):
url = f'https://www.xingmen.cc/29/29928/{data+2072590}.html'
headers = { # 通过刚才观察网页源码,发现request headers中的信息都是字典格式,因此要构建成字典
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
# 'Accept-Encoding': 'gzip, deflate, br',
# 'Accept-Language': 'zh-CN,zh;q=0.9',
# 'Cache-Control': 'max-age=0',
# 'Connection': 'keep-alive',
# 'Cookie': 'Hm_lvt_298d20c200aed9761d07ff247214636e=1673270466; Hm_lpvt_298d20c200aed9761d07ff247214636e=1673270466; bcolor=; font=; size=; fontcolor=; width=',
# 'Host': 'www.xingmen.cc',
# 'Referer': 'https://www.xingmen.cc/29/29928/',
# 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',
# 'sec-ch-ua-mobile': '?0',
# 'sec-ch-ua-platform': '"Windows"',
# 'Sec-Fetch-Dest': 'document',
# 'Sec-Fetch-Mode': 'navigate',
# 'Sec-Fetch-Site': 'same-origin',
# 'Sec-Fetch-User': '?1',
# 'Upgrade-Insecure-Requests': '1',
# 【经测试发现,注释掉这些参数也能获得正确的请求,只需将最关键的参数传给请求即可】
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
request = urllib.request.Request(url=url, headers=headers) # Request()方法定制请求对象,将url和headers打包进去
response = urllib.request.urlopen(request) # 使用urlopen触发请求对象,该对象包含了请求地址url和请求头信息headers
content = response.read().decode('utf-8') # read()获取响应结果,utf-8格式解码数据
with open(file=f'D:\PyCharm 2021.3.2\codefile\爬虫练习\第{data+1}章.html', mode='wt', encoding='utf-8')as f:
f.write(content) # 使用wt写入模式创建新的html文件,将数据写入
print(f'已保存第 {data+1}章。') # range(100)从零开始,因此章节名是 data+1
效果如下


小结:
本次只获取了网页源码,还需要进一步提取数据的操作。提取数据有多种方式诸如xpath、正则等,以后会再分享出来。