在上一篇博客中使用redis所维护的代理池抓取微信文章,开始运行良好,之后运行时总是会报501错误,我用浏览器打开网页又能正常打开,调试了好多次都还是会出错,既然这种方法出错,那就用selenium模拟浏览器获取搜狗微信文章的详情页面信息,把这个详情页面信息获取后,仍然用pyquery库进行解析,之后就可以正常的获得微信文章的url,然后就可以通过这个url,获得微信文章的信息

代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from weixin.weixin.weixin_article import WeixinArticle
from requests.exceptions import ConnectionError
from pyquery import PyQuery as pq class SeleniumWeixinArticle(WeixinArticle):
"""使用selenium模拟浏览器,获取搜狗微信搜索的详细信息,继承WeixinArticle这个类"""
proxy = None def __init__(self):
"""初始化浏览器,及部分浏览器信息"""
self.browser = webdriver.Chrome(executable_path="C:/codeapp/seleniumDriver/chrome/chromedriver.exe")
self.wait = WebDriverWait(self.browser, 10)
super(SeleniumWeixinArticle, self).__init__() def get_html(self, url, count=1):
"""重写WeixinArticle 中的get_html 用selenium模拟浏览器去获取搜狗微信搜索的信息"""
if not url:
return None
# 最后递归max_count这么多次,防止无限递归
if count >= self.max_count:
print("try many count ")
return None
print('crowling url ', url)
print('crowling count ', count)
global proxy
if self.proxy:
proxy_ip = '--proxy-server=http://' + self.proxy
chrome_options = webdriver.ChromeOptions()
# 切换IP
chrome_options.add_argument(proxy_ip)
browser = self.browser(chrome_options=chrome_options)
else:
browser = self.browser
try:
browser.get(url) # 返回值是None,要取数直接用browser.page_source
next_page = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#sogou_next")))
if browser.current_url == url:
page_source = browser.page_source
return page_source
else:
print("must change ip proxy ")
proxy = self.get_proxy(self.proxy_pool_url)
if proxy:
return self.get_html(url)
else:
print("get proxy is faired ")
return None
except ConnectionError:
count += 1
proxy = self.get_proxy(self.proxy_pool_url)
return self.get_html(url, count) if __name__ == "__main__":
weixin_article = SeleniumWeixinArticle()
weixin_article.run()

程序较为简单,主要是重写WeixinArticle中的get_html方法,其他的逻辑不变,这也是面向对象编程的好处,

程序结构逻辑如下:

selenium模拟浏览器对搜狗微信文章进行爬取的更多相关文章

  1. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  2. python爬虫实战(三)--------搜狗微信文章(IP代理池和用户代理池设定----scrapy)

    在学习scrapy爬虫框架中,肯定会涉及到IP代理池和User-Agent池的设定,规避网站的反爬. 这两天在看一个关于搜狗微信文章爬取的视频,里面有讲到ip代理池和用户代理池,在此结合自身的所了解的 ...

  3. python下selenium模拟浏览器基础操作

    1.安装及下载 selenium安装: pip install selenium  即可自动安装selenium geckodriver下载:https://github.com/mozilla/ge ...

  4. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  5. 使用selenium模拟浏览器抓取淘宝信息

    通过Selenium模拟浏览器抓取淘宝商品美食信息,并存储到MongoDB数据库中. from selenium import webdriver from selenium.common.excep ...

  6. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  7. python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  8. Python 配置 selenium 模拟浏览器环境,带下载链接

    使用浏览器渲染引擎.直接用浏览器在显示网页时解析HTML,应用CSS样式并执行JavaScript的语句. 这方法在爬虫过程中会打开一个浏览器,加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓下来 ...

  9. 16-使用Selenium模拟浏览器抓取淘宝商品美食信息

    淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...

随机推荐

  1. 【JavaScript for循环实例】

    1.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? //驮100石粮食,大马需要50匹 for(var a=0;a<=50;a++){ //驮1 ...

  2. bzoj 3065: 带插入区间K小值(分块)

    Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...

  3. STL中的nth_element()方法的使用

    STL中的nth_element()方法的使用 通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比 ...

  4. HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  5. printf不能直接输出string类型

    因为string不是c语言的内置数据,所以直接printf输出string类型的是办不到的.要这样输出: printf("%s\n",a.c_str()); 举例: #includ ...

  6. Codeforces 626C

                                                                                                        ...

  7. find the nth digit(二分查找)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1597 find the nth digit Time Limit: 1000/1000 MS (Jav ...

  8. UEP-时间的比较

    时间的比较: var rec = ajaxform.getRecord(); var sd = rec.get("startDate"); var ed = rec.get(&qu ...

  9. javascript 之继承-15

    继承 所谓继承就是子类继承父类的特征与行为,使得子类对象具与父类相同的行为.但是javascript 是没有class.抽象类.接口等抽象概念,javascript 只有对象,那么js中是如何让对象与 ...

  10. ADO.NET复习总结(2)--连接池

    1. 2. 3.示例:在一百次循环中,执行数据库连接的打开和关闭,使用stopwatch查看所用的时间. using System; using System.Collections.Generic; ...