上周四大计老师讲了一下爬取网页数据,自己也想着实验一下。
PS:此博客仅仅用来记录自己的学习试验过程
使用了Re库和urllib.request库
import urllib.request as req
import re
url='https://www.biquge5200.cc/0_7/'#小说《大主宰》的目录
webpage=req.urlopen(url)
data=webpage.read()
n=100#想要爬取的章数
data=data.decode('GB2312')#编码
t=re.findall(r'' ,data,re.S)[:n+1]#正则表达式,找到每一章对应的链接,如果把这个切片去掉就是爬取所有章节
file=open('小说测试.txt','w')
header={
'Sser-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66',\
'cookie': 'ckAC=1; UM_distinctid=176d1c304f17fa-0fbb0156ac61ee-5a301e44-144000-176d1c304f2cad; Hm_lvt_17077e8d2ddd3bade67fd92a3bcbbc9f=1609836988,1609837210; width=85%25; __gads=ID=2b5639e053290b41-2246ee337cc500f3:T=1609839046:RT=1609839046:S=ALNI_MZRmMNpw_nItx5E6dTZdkXCiitYWw; CNZZDATA1278007057=1361741296-1609834062-https%253A%252F%252Fwww.google.com%252F%7C1609839463; Hm_lpvt_17077e8d2ddd3bade67fd92a3bcbbc9f=1609839987'}
#用这个header是这个网站的,如果要换网站应该还需要重新更改
#用这个header的目的是防止网站把爬虫屏蔽掉,然鹅我发现并没有什么用,淦
for i in t:
webpage_Request = req.Request(i, headers=header)
webpage_t=req.urlopen(webpage_Request)
data_t=webpage_t.read()
data_t=data_t.decode('GB2312')
data_t_title=re.findall(r'(.+?)<'
,data_t,re.S)#获取章节名
data_t_text=re.findall(r'(.+?)
',data_t,re.S)#获取正文内容 该网站正文每一段都会用...
来包括
file.write(data_t_title[0]+'\n')#写下标题
for j in data_t_text:
file.write(j+'\n')#写下正文的每一段,每写一段换一次行
file.close()
然鹅,每次会报错,只能爬二十多章,可能这个网站防护做的太好了,待会尝试一下别的网站
urllib.error.HTTPError: HTTP Error 503: Service Temporarily Unavailable
应该是服务器主动拒绝了爬虫的访问
最后把爬来的小说半成品展示一下,只有26章QAQ
可怜的链接
正则表达式,永远滴神!
总体来说有点小失败,直接哭哭,下次试试换个保护措施差一点的网站吧
经过亢神的指正,发现User拼成Sser了,修改后可以顺利爬到60多章,但是这时会报错:
UnicodeDecodeError: ‘gb2312’ codec can’t decode byte 0x98 in position 9591: illegal multibyte sequence
经过上网查阅,把gb2312改为gb18030即可。
参见【python问题解决】UnicodeDecodeError :‘gb2312’ codec can’t decode bytes:illegal multibyte sequence
然后就成功爬取咯咯咯
爬取后的成品