这里分享一个低配版知乎爬虫,利用了Selenium模块

爬取的过程中遇到了10002:请求参数异常,请升级客户端后重试,调用知乎某用户的回答API返回的HTTP状态码是403 Forbidden

之后找了一篇博客,里面给出的解决方案是:使用自己打开的一个浏览器,再用selenium接管这个浏览器这样就可以完成反爬的处理。

步骤

1

cmd切换到chrome.exe所在的目录下,

(文件资源管理器内,到指定目录下,在地址栏输入cmd回车也行)

执行命令chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\selenium_data"

其中--remote-debugging-port是建立新的移植位置,其中端口后面会使用(自定义), --user-data-dir是数据存储的目录(自定义)

2

运行py代码爬取某用户的回答

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
import requests
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait def load_photo(url, name):
'''给定图片链接,将图片以某个名称下载到本地'''
# url = 'http://img14.360buyimg.com/n1/s450x450_jfs/t1/148801/37/12770/118749/5f9d71e4E39f1e893/533675187c108953.jpg'
reponse = requests.get(url)
# name = 'd:/photo.jpg'
with open(name, 'wb') as ft:
ft.write(reponse.content) def drop_scroll(browser):
'''将滑条从头滚动到底,以便让浏览器充分加载'''
for x in range(1, 11, 2):
# time.sleep(0.5)
j = x/10
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
browser.execute_script(js) def switch_window(browser):
'''将browser的指令移到新打开的小窗口处'''
# time.sleep(0.5) # 如果移转失败,请增大这个时间
windows = browser.window_handles
browser.switch_to.window(windows[-1]) def switch_window_back(browser):
'''将browser的指令移回旧的小窗口'''
windows = browser.window_handles
browser.switch_to.window(windows[0]) # 构造网址
u_id= input('请输入https://www.zhihu.com/people/{u_id}中的u_id')
url = f'https://www.zhihu.com/people/{u_id}'
page = int(input("要遍历的页数(从第一页开始)")) # 打开知乎
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 前面设置的端口号
browser = webdriver.Chrome(options=chrome_options) # browser.set_window_size(900, 500) # 设置窗口大小
# browser.set_window_position(300, 200) # 设置浏览器的位置
browser.get(url)
btn=browser.find_element_by_xpath("//button[@aria-label='关闭']")
browser.execute_script("arguments[0].click();", btn)
time.sleep(2) # 遍历页面中每篇回答
count = 1 # 回答的编号
for page_id in range(1,page+1):
# 翻页
print("Page:%d" %page_id)
url = f'https://www.zhihu.com/people/{u_id}/answers/by_votes/?page={page_id}'
browser.get(url)
time.sleep(2)
btn = browser.find_element_by_xpath("//button[@aria-label='关闭']")
browser.execute_script("arguments[0].click();", btn)
time.sleep(2)
switch_window_back(browser) # 将browser的指令移回到新标签页
drop_scroll(browser) #滑条拖到底,让加载完全
answers = browser.find_elements_by_xpath("//div[@class='ContentItem AnswerItem']") # 获取所有回答
for answer in answers:
print(answer.find_element_by_xpath(".//a[@data-za-detail-view-element_name='Title']").get_attribute('href')\
, answer.find_element_by_xpath(".//a[@data-za-detail-view-element_name='Title']").text\
, answer.find_element_by_xpath(".//button[@class='Button VoteButton VoteButton--up']").text
, sep=' , ')
print(count)
count=count+1

一个注意的点是webdriver.Chrome()是可以传入参数的,

executable_path传入的值得当的话不必把chromedriver.exe设在$PATH里



//以上图片来自这个网站

像极了一名爬虫新手的课程作业。。。

爬取了85页之后被知乎检测到了。。。

【WEB UI自动化】Selenium爬取用户的知乎回答时遇到10002:请求参数异常,请升级客户端后重试的更多相关文章

  1. selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)

    一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...

  2. selenium(12)-web UI自动化项目实战(PO模式,代码封装)

    web UI自动化项目实战-项目 项目使用禅道,所以你需要搭建1个禅道,搭建禅道的方法和步骤见 https://www.cnblogs.com/xinhua19/p/13151296.html 搭建U ...

  3. Python Selenium 搭建Web UI自动化

    Python搭建UI自动化环境 下载Python3 Python官网 PyCharm 环境配置 安装Python 勾选Add Python to PATH,一直下一步. 验证:CMD输入Python ...

  4. UI自动化selenium

    1.什么是UI自动化?模拟人用代码的方式去操作页面2.为什么要做UI自动化?后期迭代的时候,老功能比较多,人工维护成本较大,重复性工作较多,这个时候就考虑因为UI自动化3.什么时候做UI自动化?项目稳 ...

  5. 【Robot Framework 项目实战 02】SeleniumLibrary Web UI 自动化

    前言 SeleniumLibrary 是针对 Robot Framework 开发的 Selenium 库.它也 Robot Framework 下面最流程的库之一.主要用于编写 Web UI 自动化 ...

  6. UI自动化(selenium+python)之元素定位的三种等待方式

    前言 在UI自动化过程中,常遇到元素未找到,代码报错的情况.这种情况下,需要用等待wait. 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverW ...

  7. web端自动化——Selenium Grid原理

     利用Selenium Grid可以在不同的主机上建立主节点(hub)和分支节点(node),可以使主节点上的测试用例在不同的分支节点上运行.  对不同的节点来说,可以搭建不同的测试环境(操作系统.浏 ...

  8. Selenium系列(十四) - Web UI 自动化基础实战(1)

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  9. Selenium系列(十五) - Web UI 自动化基础实战(2)

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  10. Selenium系列(十六) - Web UI 自动化基础实战(3)

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

随机推荐

  1. ssr next 学习记录

    预加载页面   只有生产环境才有 当页面初始化加载时,getInitialProps只会加载在服务端.只有当路由跳转(Link组件跳转或 API 方法跳转)时,客户端才会执行getInitialPro ...

  2. SQL 查询各表所占大小

    SELECT OBJECT_NAME(id) tablename , CASE WHEN reserved * 8 > 1024 THEN RTRIM(8 * reserved / 1024) ...

  3. 搭建Spring的源码环境

    搭建Spring的源码环境,包括以下几个步骤: 1.从Spring官网一步步找到Spring源码在github上的位置,并拉取Spring源码 2.安装和配置Gradle,用于构建Spring的源码 ...

  4. 【STM32】NVIC嵌套中断向量控制器与外部中断

    两种优先级 抢占优先级PreemptPriority:中断服务函数正在执行时,抢占优先级高的可以打断抢占优先级低的,实现中断的嵌套,相当于51的"高优先级" 响应优先级(子优先级) ...

  5. Sentinel 高可用流量管理框架

    出处:https://www.oschina.net/p/sentinel?hmsr=aladdin1e1 Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流.流量 ...

  6. WSL2与ensp的40故障

    在使用ensp做radius认证的时候看到了Linux平台的freeradius认证服务器,于是使用了Windows平台的sub system: WSL2,按照网上的教程安装,并且安装了docker ...

  7. JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generators/yield、async/awt

    所有异步任务都是在同步任务执行结束之后,从任务队列中依次取出执行. 回调函数是异步操作最基本的方法,比如AJAX回调,回调函数的优点是简单.容易理解和实现,缺点是不利于代码的阅读和维护,各个部分之间高 ...

  8. c# 串口 转发到 TCP 客户端

    前言 对于数据流Stream的转发.在.net 3.5之后的版本只需要 stream.CopyTo(stream). 目前只是为了方便调用测试,花了一点点时间做了一个简单的调用demo 完整代码 us ...

  9. OPENSUSE网速慢

    无线网卡是Broadcom 4313,刚安装完opensuse,网速只有60Kb左右. 添加packman私有驱动后,网速才正常起来.

  10. Python+Django(1)——建立项目

    为项目新建一个目录,将其命名为learning_log,再在终端中切换到这个目录(Python 3): 运行模块venv 来创建一个名为ll_env的虚拟环境:python -m venv ll_en ...