大家好,今天给大家带来Python爬虫的简易制作,很适合新手练手。
爬虫即是利用程序模仿真实用户浏览网页并记录目标内容,从而可避过网站的广告,以获取较好的阅读体验。
本次以辰东大神的新书《圣墟》为例,向大家展示一下爬虫。欢迎大家批评指正。
需要用到的工具:
python3.x
pycharm
思路:
1.获取页面源代码
2.获取章节链接
3.获取章节网页源代码
4.获取正文
5.下载至本地
具体步骤及代码如下:
一.获取页面源代码:
1.搜索圣墟,进入笔趣阁网站,获取网站地址:https://www.biqiuge.com/book/4772/,按F12进入网页源码界面。
2.打开pycharm,建立Python文件,导入requests等库,并利用requests库中的get函数获取页面源码,具体代码如下:
import urllib.request
import re
import requests
def download_novel():
url = 'https://www.biqiuge.com/book/4772/'
html = requests.get(url)#获取页面源码
html_content = html.content#以二进制编码读出页面源码
html_content = html_content.decode('gbk')#指定编码(可在网页源码中搜索charset获取网页编码)
二.获取章节链接
1.现在已经获取网页的全部内容了,下一步就是筛选出我们想要的信息,即各个章节链接。
可以看出各个章节前后的H5标签是相同的,由此可以利用正则表达式对其进行处理。大家可以看下廖雪峰老师对正则表达式的讲解,很透彻、详细。在此不作过多解释。正则表达式
实现代码如下:
reg = r'<dd><a href ="/book/4772/(.*?)">(.*?)</a></dd>'#筛选章节链接
urls = re.findall(reg,html_content)#列表:章节链接
这时需要注意:《圣墟》现在还是连载状态,所以在章节前有六章新更新的章节,这些章节我们也读取了,所以要对其进行处理。当时第一思路是想利用正则表达式不读取前面那几章,但由于网页的设计等原因,不是太易于实现。然后猛然想到,章节链接是读取到列表中的,何不直接删除那几个元素呢?而且代码实现也超级简单。于是我采取了这种方式,成功地剔除了重复的章节。
三.获取章节网页源代码
具体操作跟上一步类似。
四.获取正文
爬出正文网页后,同样利用正则表达式筛选出正文。(需要注意笔趣阁这个网站,网站编码不太规范,在正文最后到标签的最后几个空格,数量是不一样的,因为我们采用的是精确匹配,所以爬取一章后,后面就出现错误了,这个浪费了我很长时间。最后我把空格也利用正则中(.*?)的特性,把空格也读取了下来)具体代码如下:
for url in urls:
novel_url: Union[str, Any]='https://www.biqiuge.com' + url[0]#正文地址
novel_title=url[1]#章节名称
chapt = requests.get(novel_url)#地址所有内容
tempt = chapt.content
chapt_html = tempt.decode('gbk')#指定编码
reg=r'class="showtxt">(.*?)https:'#读取正文
chapt_content = re.findall(reg,chapt_html)#正则表达式筛选后
然后需要对读取的数据进行清洗,去掉H5的标签。
五.下载至本地
最后一步就是下载正文至本地的txt文件中了。代码如下:
print('正在下载 %s'%novel_title)#在屏幕显示下载的章节
f = open('圣墟.txt','a')#建立或打开文件以读写
f.write(novel_title+chapt_content)#写入
f.close()#关闭文件
注意:以上代码只是Python爬虫的一个简单思路,还不能用于实战,只能下载前几章,然后IP就会被网站封禁。因为网站的风控技术可以检测到是非真实用户访问的。
下一篇给大家带来如何骗过网站的风控技术,模仿真实用户访问网站。后附源码,欢迎大家批评指正。
爬虫源码