python爬虫四:鼠标点击模拟、JS分析

一,爬取目标

http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist

二,需求分析

需求很简单,就是爬取所有数据。

当然,也可以顺便提供一个,搜索某个关键词之后,爬取所有数据的功能。

难点在于,无论点哪里,url看起来永远是一样的,这就增大了爬虫的难度

爬虫需要做的事情:

1,爬取目标是ajax页面,需要selenium+无头浏览器

2,网页里面的搜索框(可选功能)

3,选项按钮

默认页面中,信息类型 和 选择时间 都不是选全部,要想爬取所有数据,需要改这2个选项。

4,选择页面

三,关键技术

1,动态网页:selenium+无头浏览器

phantomjs.exe已经不能用了,所以这里用的是chromedriver.exe

安装selenium,然后下载chromedriver.exe放到c盘根目录,如下代码即可用它打开网页

base_url = "http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist"
driver = webdriver.Chrome(executable_path=r'C:\chromedriver.exe', options=chrome_options,service_args=['--load-images=no'])
driver.get(base_url)

2,选项按钮:find_element_by_xpath

查看网页源码,搜索信息类型

于是我们就有了点击“全部”按钮的代码:

select_type_box = driver.find_element_by_xpath("//ul[@class='select_type_box clearfix']/li[1]")
select_type_box.click()

同理,选择时间

选择时间的代码:

select_time_box = driver.find_element_by_xpath("//ul[@class='fl select_time_box']/li[1]")
select_time_box.click()

3,下一页:onclick、JS分析、浏览器抓包

本来我以为很简单:

next_page = driver.find_element_by_xpath("//div[@class='pagination']/ul[1]/li[11]")
next_page.click()

然而执行报错:Element is not clickable at point

也就是说,无头浏览器可以轻松点击button,但是对onclick却没那么容易。

于是,我开始扒拉JS,F12进调试模式,可以看到一些东西,这个网站只能看到3个js

搜索了一些,并没有找到page函数,不过在网页源码中倒是找到了page函数

这里发现了一个链接!!!

我斗胆猜测,searchword就是搜索框,于是试了一下

http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?searchword=5G

果然可以!

同样的思路,又失败了,再也找不到类似的链接了。

于是我又在网上找资料,找到一篇讲浏览器抓包的文章:https://blog.csdn.net/weixin_39610722/article/details/110960576

先打开跟踪,然后点击第4页:

找到URL,右键copy as cURL,内容如下:

curl 'http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist' \
  -H 'Connection: keep-alive' \
  -H 'Cache-Control: max-age=0' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'Origin: http://zb.yfb.qianlima.com' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Referer: http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist' \
  -H 'Accept-Language: zh-CN,zh;q=0.9' \
  -H 'Cookie: JSESSIONID=C20E9758652DE1F141E51B349D4AE839; __jsluid_h=2b424c9697bd9692d2ad1451300a9c75; Hm_lvt_a31e80f5423f0ff316a81cf4521eaf0d=1610549640; pageSize=15; keywords=%E5%8D%83%E9%87%8C%E9%A9%AC%E6%8B%9B%E6%A0%87; keywordvaluess=""; laiyuan=3; Hm_lvt_0a38bdb0467f2ce847386f381ff6c0e8=1610550267; Hm_lpvt_0a38bdb0467f2ce847386f381ff6c0e8=1610550267; Hm_lvt_5dc1b78c0ab996bd6536c3a37f9ceda7=1610550268; Hm_lpvt_5dc1b78c0ab996bd6536c3a37f9ceda7=1610550268; UM_distinctid=176fc46d0a65b3-0c99d08cd43d87-31346d-e1000-176fc46d0a7d20; gr_user_id=97220f81-4919-4a9d-a198-24b3caf49796; pageNo=4; Hm_lpvt_a31e80f5423f0ff316a81cf4521eaf0d=1610560460' \
  --data-raw 'pageNo=7&kwname=&pageSize=15&ipAddress=122.96.44.71&searchword=&searchword2=&hotword=&provinceId=&provinceName=&areaId=&areaName=&infoType=0&infoTypeName=&noticeTypes=&noticeTypesName=&secondInfoType=&secondInfoTypeName=&timeType=5&timeTypeName=%E8%BF%91%E4%B8%80%E5%B9%B4&searchType=2&clearAll=false&e_keywordid=&e_creative=&flag=0&source=baidu&firstTime=1' \
  --compressed \
  --insecure

还没来得及仔细看,一眼就看出来里面有这么一个式子:pageNo=4

我斗胆猜测,这就是我们要找的东西了,试了一下http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?pageNo=4,果然可以!

同理,我们还得到了infoType和timeType

于是,我们发现,对JS彻底分析之后,就不需要啥爬虫了,直接按顺序读html即可。

然后我发现,不管搜什么,不管筛选什么,最多都只显示30页,多的就不显示了。

新一轮的较量正在酝酿。。。

首先,我得到了这个链接

http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?infoType=0&timeType=0&searchword=5G&pageNo=1&pageSize=1000

然后我一想,我都一页1000条了,我还要pageNo干啥!

http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?infoType=0&timeType=0&searchword=5G&pageSize=1000

这个数据足够大的话,该关键词搜索的全部结果就能显示出来了,并没有查询数量限制。

四,代码

爬虫草稿:

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless")
base_url = "http://zb.yfb.qianlima.com/yfbsemsite/mesinfo/zbpglist?infoType=0&timeType=0&searchword=5G&pageNo=1"
driver = webdriver.Chrome(executable_path=r'C:\chromedriver.exe', options=chrome_options,service_args=['--load-images=no'])
driver.get(base_url)
select_type_box = driver.find_element_by_xpath("//ul[@class='select_type_box clearfix']/li[1]")
select_type_box.click()
select_time_box = driver.find_element_by_xpath("//ul[@class='fl select_time_box']/li[1]")
select_time_box.click()
print(driver.page_source)
while True:
    next_page = driver.find_element_by_xpath("//div[@class='pagination']/ul[1]/li[11]")
    next_page.click()
    print(driver.page_source)
driver.close()

因为暂时不需要这样爬了,所以代码先不更了。

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/112598545