【目标】本文使用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请求网址。
- 接下来,查询该记录的请求头,看看要带哪些数据给请求网址才能获取到该信息。
必要带的数据似乎有点多。经测试发现我们只把末了一个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、正则等,以后会再分享出来。 |