准备
转哔哩哔哩上的一个up主视频作为前期的学习准备
(https://www.bilibili.com/video/av19954075?from=search&seid=851521342585466773)
首先我们要明确我们要用到的库:requests和re,库的导入这里就不多讲解了直接去看就好了
值得一提的是快速锁定pip位置在Scripts用shift+右键即可 转:(https://blog.csdn.net/vily_luky/article/details/82456659)
过程
根据浏览器的运行机制
1.运行DNS客户端
2.浏览器从接收的域名字段中抽取url也就是地址(主机名)
3.DNS客户端向DNS服务器发送查询报文(内含主机名)
4.该DNS最终会收到一份回答报文(内含主机名对应的ip地址 )
5.浏览器通过接收到的IP地址定位HTTP服务器并发起TCP连接
接着上代码
#!/usr/local/bin/python3.7
# encoding: utf-8
import requests
import re
#抓取网页源码
url='https://wap.qishuta.com/Shtml7299.html'
head={'User-Agent':' Mozilla/5.0'} #伪装头
respnse=requests.get(url,head) #模拟浏览器发送get请求
respnse.encoding="utf-8" #改变编码格式(不然中文会出现乱码)
html=respnse.text #接收返回包(也就是源码)
BT=re.findall(r'meta property="og:title" content="(.*?)"',html)[0] #抓取小说名字
f=open('%s.txt' %BT,'w',encoding='utf-8') #创建一个文本保存小说
ul=re.findall(r'<div class="list_xm">.*?<div class="info_menu">',html,re.S)[0] #抓小说目录
infolist=re.findall(r'href="(.*?)">(.*?)<',ul)#抓每一章的url和名字
for infoma in infolist :#循环每一章的url和名字
curl,ctit=infoma #定义每章节的url和名字
curl="https://wap.qishuta.com"+curl #url补全
crespon=requests.get(curl) #访问每一章节
crespon.encoding='utf-8' #改编码格式
chtml=crespon.text #接收章节源码的返回包
content=re.findall(r'<div id="novelcontent" class="novelcontent"><p>(.*?)<script id="chstnut2">',chtml,re.S) #抓取正文
content=''.join(content) #将list格式变成str格式
#数据清洗
content=content.replace(' ','')
content=content.replace(' ','')
content=content.replace('<br/>','')
#永久保存小说,文件写入
f.write(ctit)
f.write('\n')
f.write(content)
f.write('\n')
#确认输出
print(curl)
遇到的问题
1.关于包的导入,有些机子可能会出现错误,这里再补充几种方法 转:(https://www.cnblogs.com/haifeima/p/9799167.html)看三就好了
2.关于代码块内的中文转码:
记得导入 encoding: utf-8
3.关于返回包的中文转码:
有些时候在一些特殊的格式下使用encoding: utf-8是行不通的看这篇博客找到了解决方法 转:https://blog.csdn.net/daimashiren/article/details/90577679
再不行就换网址吧。
4.对于正则表达式的研究也不要放下 转:https://www.runoob.com/python/python-reg-expressions.html
5.在最后的清洗数据的时候有时候会遇到replace方法无法调用,原因是需要转的参数是list不是str
这时候伟大的度娘告诉我 转:https://blog.csdn.net/bufengzj/article/details/90231555
6.加伪装头方法是
用谷歌浏览器加F12找到user-agent,在requests-headers里像文中那样复制下来即可
7.关于正则表达式截取字符串的唯一标识符的找法也是用谷歌浏览器F12看返回的源代码或者直接进入网页ctrl+u 例如id==,class==