爬虫进阶实战(标价1000的单子)-灵析社区

秋叶无缘

前言

这次这个单子是别人做不了然后我接手的。说实话,一开始看到任务我以为我运气好捡漏了,后来才发现天上不会掉馅饼。

这个网站的反爬技术真的不错,这个没点水平还真的解决不了。而我恰恰是业余爱好者,就是那种没点技术水平的。还早后来我剑走偏锋,爬了两天两夜终于把这个任务交付了。

这里就想把这个剑走偏锋的方法贴出来,然后供大家参考,给大家反爬提供一个别样的思路。

项目需求

这次的任务是这个网站: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卡了我一天。

中途我尝试过各种方法去解决这个问题,因为我也是个业余的大家看个笑话就好:

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')

剩下的解析这里不多哔哔了。

个人总结:

这里也算是给大家提供一个爬虫的新思路供大家参考。其实算是很笨的方法,但是挺有用的。

后续可能会把这一套封装好,毕竟谁也不想那个页面不停的开开关关的,在这期间严重影响电脑的使用。


阅读量:532

点赞量:0

收藏量:0