dave
2022/10/19阅读:35主题:默认主题
爬虫进阶实战(标价1000的单子)
本文所属专栏:爬虫方法论 - DaveCui的专栏 - 掘金 (juejin.cn)
专栏记录了我本人在工作室接爬虫单的几个经典的真实案例,干货满满,这可是吃饭的家伙,还不关注一波。
专栏历史文章:
爬虫入门实战(标价400的单子-1) - 掘金 (juejin.cn)
爬虫入门实战(标价400的单子-2) - 掘金 (juejin.cn)
前言
这次这个单子是别人做不了然后我接手的。说实话,一开始看到任务我以为我运气好捡漏了,后来才发现。
这个网站的反爬技术真的不错,这个没点水平还真的解决不了。而我恰恰是业余爱好者,就是那种没点技术水平的。还早后来我剑走偏锋,爬了两天两夜终于把这个任务交付了。
这里就想把这个剑走偏锋的方法贴出来,然后供大家参考,给大家反反爬提供一个别样的思路。
项目需求
这次的任务是这个网站:WebNovel
这个网站是美国的应该,需要一点科学手段才能访问。
客户给了个csv文件,里面包含了目标小说的书名。
最终的要求就是把表格内的所有小说的章节目录爬下来。包括书名,书的ID,章节ID,章节更新时间,是否是VIP章节等信息。
注意:目标不是小说内容,是目录。
看起来是个非常简单的任务是吧,后面有坑的,这个网站的。
一、分析目标页面
我们首先随便打开一个小说的主页。
关注到这样几个信息
-
链接的规则 -
目标章节目录的位置。
很明显昂,每个页面链接的规则非常简单,网站主页地址加上book/小说名字_长数字字符ID
这个目录章节本来我以为我要用selinum
自动化去点击这个按钮才能显示章节目录呢,但是其实你在链接后面加个\catalog
就能直接进入章节目录的界面。
至于我为什么能发现,F12就能看到哈:

直接通过链接进入章节目录,这种简单的解析页面就不讲了。

二、信心满满的准备
当时我用了半个小时左右吧,分析了下任务,甚至把所有目标小说的链接爬了下来。
这里就放一个关键代码吧。
url ='https://www.webnovel.com/search?keywords='+name
# name就是书名
r = requests.get(url, headers=headers, proxies = proxies)
html = r.content.decode('utf-8', 'ignore')
my_page = BeautifulSoup(html, 'lxml')
tag=my_page.find_all('li', class_="pr pb20 mb12")[0]
title=tag.a.attrs['title']
row.append(title)
href=tag.a.attrs['href']
row.append(href)
循环爬完之后的结果:
然后我这一看,不用试了,跟客户吹牛逼说,两天。
两天主要考虑到两方面,一方面是1000块钱我总不能说给我俩小时。另一方面是,可能在爬的时候遇到bug让自己立于不败之地。
-
后来果然出事了
三、惨遭滑铁卢
我没想到啊,真的没想到。这个小小的comming soon
卡了我一天。

中途我尝试过各种方法去解决这个问题,因为我也是个业余的大家看个笑话就好:
1.selinum自动化,延迟几秒等他反应过来。
但是把基本上现在的网站都有反爬机制,显示出这个,然后就会有很多人机验证或者直接不把数据给你给出来。
这里就是第二种,你不管怎么点,都是不会把数据给你的,一直comming soon
2.尝试查询资料,解决这个识别问题。
结果查阅资料,我发现了这个识别其实是selinum自己给自己的一个限制。也就是说通过一定的手段,可以解决的。通过执行一个自己创建的js
文件,修改几个配置变量,就能让浏览器或者后台把他作为正常的请求。
很明显,我的水平不够,没解决。
以后解决了再贴出来。
3.requests_html的render等待。
我在查阅资料(指csdn、掘金、百度、google的病急乱投医),看到了这样的一个代码。本着试试也不吃亏的态度试了下。
from requests_html import HTMLSession
def open_url(url):
headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'}
session = HTMLSession()
resp = session.get(url, headers=headers)
resp.html.render(timeout=20)
return resp.html.html
这个方法最后也没成功。
而此时,因为当时有个妹子乱我道心,导致我码代码效率低下。时间只剩下一天了。
四、返璞归真,大巧不工
其实,反爬机制就是通过鉴别爬虫和正常访问的区别从而禁止爬虫的访问。而反反爬技术就是尽量把自己的爬虫伪装成正常的访问。
所以这个时候我悟了,我用浏览器直接访问页面,网站终究会给我最终的章节信息。
我当时直接ctrl+s
确实也能通过保存下来的html文件解析出章节目录信息。所以思路很清晰了。
网站不会拒绝正常的访问,而最正常的访问就是直接打开链接。
所以我们需要的是一个自动打开链接的工具,和一个自动保存的工具。
1.自动打开链接:
这个就是自动打开链接的方法,完全正常访问,不会防备的那种。
import webbrowser
webbrowser.open_new_tab(url)
2.自动保存页面:
这个东西,真的python处理不了,因为毕竟那个页面打开后也不想selinum
那样还被python的库控制着,所以,我找了个插件Save Page WE


这个就是能够自动保存界面,还支持延迟,自动关闭页面。正好完美的符合我们的需求。
五、开始执行
后面有完整的代码,他的逻辑很好理解昂
1. 自动打开界面
中间用sleep延迟了下,因为要给网站反应的时间
2. Save Page WE自动保存页面
3. 查看下载目录是否多了一个html
文件
import webbrowser
import csv
import time
import os
csv_file=csv.reader(open('url.csv','r',encoding='utf-8'))
sum=0
error=[]
pre=0
#295
for line in csv_file:
if pre<1187:#444 /book/forsaken-core_17161136306825805
pre+=1
else:
print(pre,line[2],end=' ')
url ='https://www.webnovel.com'+line[2]+'/catalog'
webbrowser.open_new_tab(url)
time.sleep(8)
while 1:
path = "C:/Users/Dave-Cui/Downloads/"
fileList = os.listdir(path) # 待修改文件夹
os.chdir(path) # 将当前工作目录修改为待修改文件夹的位置
num = 0 # 名称变量
for fileName in fileList: # 遍历文件夹中所有文件
if fileName.endswith(".html"):
num += 1
if num-pre==1:
pre=num
time.sleep(5)
print(pre,'成功!')
break
当天晚上,我的电脑真的一直忽明忽暗的。然后一共是三千多个html
文件,后面就是解析html
文件了。
这个解析和我们request.get
获取到的解析是完全一致的,只是获取需要
with open (filename,"r","utf-8") as f:
html=f.read()
my_page = BeautifulSoup(html, 'lxml')
剩下的解析这里不多哔哔了。
个人总结:
这里也算是给大家提供一个爬虫的新思路供大家参考。其实算是很笨的方法,但是挺有用的。
后续可能会把这一套封装好,毕竟谁也不想那个页面不停的开开关关的,在这期间严重影响电脑的使用。
作者介绍