这次这个单子是别人做不了然后我接手的。说实话,一开始看到任务我以为我运气好捡漏了,后来才发现天上不会掉馅饼。
这个网站的反爬技术真的不错,这个没点水平还真的解决不了。而我恰恰是业余爱好者,就是那种没点技术水平的。还早后来我剑走偏锋,爬了两天两夜终于把这个任务交付了。
这里就想把这个剑走偏锋的方法贴出来,然后供大家参考,给大家反反爬提供一个别样的思路。
这次的任务是这个网站:WebNovel
这个网站是美国的应该,需要一点科学手段才能访问。
客户给了个csv文件,里面包含了目标小说的书名。
最终的要求就是把表格内的所有小说的章节目录爬下来。包括书名,书的ID,章节ID,章节更新时间,是否是VIP章节等信息。
注意:目标不是小说内容,是目录。
看起来是个非常简单的任务是吧,后面有坑的,这个网站的。
我们首先随便打开一个小说的主页。
关注到这样几个信息
很明显昂,每个页面链接的规则非常简单,网站主页地址加上book/小说名字_长数字字符ID
这个目录章节本来我以为我要用selinum
自动化去点击这个按钮才能显示章节目录呢,但是其实你在链接后面加个\catalog
就能直接进入章节目录的界面。
至于我为什么能发现,F12就能看到哈:
直接通过链接进入章节目录,这种简单的解析页面就不讲了。
当时我用了半个小时左右吧,分析了下任务,甚至把所有目标小说的链接爬了下来。
这里就放一个关键代码吧。
headers = {'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'}
proxies ={
"http": "http://127.0.0.1:1080",
"https": "http://127.0.0.1:1080",
}
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
卡了我一天。
中途我尝试过各种方法去解决这个问题,因为我也是个业余的大家看个笑话就好:
但是把基本上现在的网站都有反爬机制,显示出这个,然后就会有很多人机验证或者直接不把数据给你给出来。
这里就是第二种,你不管怎么点,都是不会把数据给你的,一直comming soon
结果查阅资料,我发现了这个识别其实是selinum自己给自己的一个限制。也就是说通过一定的手段,可以解决的。通过执行一个自己创建的js
文件,修改几个配置变量,就能让浏览器或者后台把他作为正常的请求。
很明显,我的水平不够,没解决。
以后解决了再贴出来。
我在查阅资料(指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文件解析出章节目录信息。所以思路很清晰了。
网站不会拒绝正常的访问,而最正常的访问就是直接打开链接。
所以我们需要的是一个自动打开链接的工具,和一个自动保存的工具。
这个就是自动打开链接的方法,完全正常访问,不会防备的那种。
import webbrowser
webbrowser.open_new_tab(url)
这个东西,真的python处理不了,因为毕竟那个页面打开后也不想selinum
那样还被python的库控制着,所以,我找了个插件Save Page WE
这个就是能够自动保存界面,还支持延迟,自动关闭页面。正好完美的符合我们的需求。
后面有完整的代码,他的逻辑很好理解昂
中间用sleep延迟了下,因为要给网站反应的时间
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')
剩下的解析这里不多哔哔了。
这里也算是给大家提供一个爬虫的新思路供大家参考。其实算是很笨的方法,但是挺有用的。
后续可能会把这一套封装好,毕竟谁也不想那个页面不停的开开关关的,在这期间严重影响电脑的使用。
阅读量:532
点赞量:0
收藏量:0