2019独角兽企业重金招聘Python工程师标准>>>

声明:此篇文章主要是观看静觅教学视频后做的笔记,原教程地址:https://cuiqingcai.com/

在抓取网页时,某些网站会有封ip的现象,所以选择利用代理伪装我们的ip进行爬虫请求,但进行爬虫时可能需要很多ip,这时就要求维护一个代理池(池也就是代理队列),可放进代理,也可取出代理。我就选择的崔庆才老师维护的代理池,是用Flask和Redis维护的一个代理池。

代理池设计思路

1.从各大网站获取免费的有用代理

2.用Redis来维护池的队列存储

3.维护池,剔除无用的代理,获得有用的代理

4.Flask是实现代理池的一个接口,返回到web上

具体实现请看:Flask+Redis维护代理池

抓取微信文章思路

1.通过搜狗爬取微信文章

2.前十页信息不需要验证,10页到100页需要微信登录验证

3.发现浏览多页后会返回302状态码,跳到反爬虫的页面,此时的ip已经被封,需要输入3次验证码才能继续浏览

流程框架

1.抓取索引页内容:利用requests请求目标站点,得到索引网页HTML代码,返回结果。

2.代理设置:如果遇到302状态码,则证明IP被封,切换代理重试

3.分析详情页内容:请求详情页,分析得到标题,正文等内容

4.将数据保存到数据库

实现步骤

1.打开搜狗搜索引擎,进入:http://weixin.sogou.com/weixin?

2.实现从代理池中获取代理

import requests
from requests.exceptions import ConnectionErrorPROXY_POOL_URL = 'http://127.0.0.1:5000/get'def get_proxy():"""作用:从代理池中获取一个代理IP"""try:# 运行代理池,从Flask网页中读取IPresponse = requests.get(PROXY_POOL_URL)if response.status_code == 200:return response.text# 如果状态码不是200,也返回Nonereturn Noneexcept ConnectionError:return None

3.定义一个get_html函数,利用代理来获取页面源码,并通过url形参来传入访问地址

from requests.exceptions import ConnectionError
import requestsproxy = None
MAX_COUNT = 5headers = {'Cookie': 'SUID=F6177C7B3220910A000000058E4D679; SUV=1491392122762346; ABTEST=1|1491392129|v1; SNUID=0DED8681FBFEB69230E6BF3DFB2F8D6B; ld=OZllllllll2Yi2balllllV06C77lllllWTZgdkllll9lllllxv7ll5@@@@@@@@@@; LSTMV=189%2C31; LCLKINT=1805; weixinIndexVisited=1; SUIR=0DED8681FBFEB69230E6BF3DFB2F8D6B; JSESSIONID=aaa-BcHIDk9xYdr4odFSv; PHPSESSID=afohijek3ju93ab6l0eqeph902; sct=21; IPLOC=CN; ppinf=5|1491580643|1492790243|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZToyNzolRTUlQjQlOTQlRTUlQkElODYlRTYlODklOER8Y3J0OjEwOjE0OTE1ODA2NDN8cmVmbmljazoyNzolRTUlQjQlOTQlRTUlQkElODYlRTYlODklOER8dXNlcmlkOjQ0Om85dDJsdUJfZWVYOGRqSjRKN0xhNlBta0RJODRAd2VpeGluLnNvaHUuY29tfA; pprdig=j7ojfJRegMrYrl96LmzUhNq-RujAWyuXT_H3xZba8nNtaj7NKA5d0ORq-yoqedkBg4USxLzmbUMnIVsCUjFciRnHDPJ6TyNrurEdWT_LvHsQIKkygfLJH-U2MJvhwtHuW09enCEzcDAA_GdjwX6_-_fqTJuv9w9Gsw4rF9xfGf4; sgid=; ppmdig=1491580643000000d6ae8b0ebe76bbd1844c993d1ff47cea','Host': 'weixin.sogou.com','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
}def get_html(url, count=1):"""作用:通过代理访问与正常访问来回切换,获得页面源码url: 需要返回的页面url地址count: 捕获异常次数,即错误尝试,默认为1"""print('Crawling', url)print('Trying Count', count)# 定义一个proxy的全局变量global proxy# 判断count次数是否超过最大次数,就返回Noneif count >= MAX_COUNT:print('Tried Too Many Counts')return Nonetry:# 判断是否从代理池中拿到proxy代理if proxy:proxies = {'http': 'http://' + proxy}# 使用代理访问,allow_redirects=False表示关闭默认的重定向跳转response = requests.get(url, allow_redirects=False, headers=headers, proxies=proxies)else:# 没有拿到代理则使用正常IP访问response = requests.get(url, allow_redirects=False, headers=headers)if response.status_code == 200:return response.textif response.status_code == 302:# Need Proxyprint('302')# 页面出现302状态码后,重新获取一个代理IP,并使用这个IPproxy = get_proxy()if proxy:print('Using Proxy', proxy)# 递归调用当前函数获取页面源码return get_html(url)else:print('Get Proxy Failed')return Noneexcept ConnectionError as e:print('Error Occurred', e.args)proxy = get_proxy()# 捕获到异常,错误尝试次数+1,超过规定次数就退出当前if语句执行count += 1return get_html(url, count)

3.以搜索关键词Python为例,抓取Python相关微信文章,然后使用Network选项卡的Doc选出访问目标网址的参数,可以看到如下内容

其中Headers的内容是需要加到请求头的,Query String Parameters的内容是请求参数,可通过urlencode转码拼接成最终访问URL,那么就有

from urllib.parse import urlencodebase_url = 'http://weixin.sogou.com/weixin?'
KEYWORD = 'python'def get_index(keyword, page):"""作用: 主要是调用get_html函数,实现与get_html函数功能相同keyword: 搜索的关键字page:访问的页码"""data = {'query': keyword,'type': 2,'page': page}# 将get的参数进行转码queries = urlencode(data)url = base_url + querieshtml = get_html(url)return html

4.接下来,通过get_index函数拿到了源码之后,就需要对网页元素进行解析,找到每篇文章的链接,也就是a标签

可以发现,该a标签的选择器为.news-box .news-list li .txt-box h3 a,那么可以通过pyquery解析库来进行解析

from pyquery import PyQuery as pqdef parse_index(html):"""作用:使用pyquery库对网页进行解析,并提取文章的a标签跳转urlhtml: 网页源码,即通过get_index函数获得"""doc = pq(html)items = doc('.news-box .news-list li .txt-box h3 a').items()for item in items:yield item.attr('href')

5.再通过get_detail函数访问每个详情页链接,并通过parse_detail函数解析详情页,获取每篇文章的内容

from pyquery import PyQuery as pq
from lxml.etree import XMLSyntaxError
import requestsdef get_detail(url):"""作用: 获取每篇文章的详情页网页源码url: 详情页url地址"""try:response = requests.get(url)if response.status_code == 200:return response.textreturn Noneexcept ConnectionError:return Nonedef parse_detail(html):"""作用: 对每篇文章的详情页进行解析,使用pyqery库对网页进行解析html: 详情页的网页源码,通过get_detail函数获得 """try:doc = pq(html)title = doc('.rich_media_title').text()content = doc('.rich_media_content').text()date = doc('#post-date').text()nickname = doc('#js_profile_qrcode > div > strong').text()wechat = doc('#js_profile_qrcode > div > p:nth-child(3) > span').text()return {'title': title,'content': content,'date': date,'nickname': nickname,'wechat': wechat}except XMLSyntaxError:return None

6.将字典形式的数据内容保存至MongoDB中

MONGO_URL = 'localhost'
MONGO_DB = 'weixin'# 定义一个MongoDB本地客户端
client = pymongo.MongoClient(MONGO_URL)
# 在本地客户端创建一个数据库
db = client[MONGO_DB]def save_to_mongo(data):"""作用: 将详情页解析的数据存储在MongoDB中data: 需要存储的数据"""# 判断存储数据是否发生更新if db['articles'].update({'title': data['title']}, {'$set': data}, True):print('Saved to Mongo', data['title'])else:print('Saved to Mongo Failed', data['title'])

7.最后通过定义的爬虫调度器函数使用前面定义的功能模块,完成对微信文章的抓取

def WexinArticles_Spider():# 通过cookie访问100页for page in range(1, 101):# 加入keyword即page参数,获得文章列表源码html = get_index(KEYWORD, page)if html:# 对文章列表进行解析,拿到每篇文章的url地址article_urls = parse_index(html)for article_url in article_urls:# 使用get_detail函数访问每篇文章详情页地址article_html = get_detail(article_url)if article_html:# 解析每篇文章详情页数据article_data = parse_detail(article_html)print(article_data)if article_data:# 保存至MongoDB数据库save_to_mongo(article_data)

8.完整源码地址:https://github.com/XiaoFei-97/WeXinArticles_Spider

原文出处:https://www.jzfblog.com/detail/72,文章的更新编辑以此链接为准。欢迎关注源站文章!

转载于:https://my.oschina.net/zhenfei/blog/2243630

使用代理抓取反爬微信文章相关推荐

  1. 【爬虫剑谱】二卷7章 实战篇-搭建IP代理池绕过反爬检测

    Python\网络爬虫\IP代理 一.源代码 二.实战总结 1.如何生成API链接 2. 如何获取API生成的IP 三.参考文献 一.源代码 import requests import random ...

  2. 开箱即用的高匿代理抓取工具

    golang-proxy v3.0 golang-proxy是一个开箱即用的高匿代理抓取工具, 它是语言无关的 项目地址: https://github.com/storyicon/golang-pr ...

  3. 给iPhone手机设置BurpSuite代理抓取手机HTTP/HTTPs流量

    iPhone设置BurpSuite代理 给iPhone手机设置BurpSuite代理抓取手机HTTP/HTTPs流量 1. Burpsuite设置代理 在burpsuite中添加代理ip和端口,ip为 ...

  4. python通过代理访问网页_Python使用PyCurl通过SOCK5代理抓取网页 - Python - 服务器之家...

    Python使用PyCurl通过SOCK5代理抓取网页 发布时间:2013-10-09

  5. python—简单数据抓取三(简单IP地址代理、利用蘑菇代理实现IP地址代理刷新本地ip地址、利用蘑菇代理实现IP地址代理抓取安居客信息并实现多线程)

    学习目标: python学习二十三 -数据抓取三. 学习内容: 1.简单IP地址代理 2.利用蘑菇代理实现IP地址代理刷新本地ip地址 3.利用蘑菇代理实现IP地址代理抓取安居客信息并实现多线程 1. ...

  6. golang-proxy 具有性能评估功能的高性能免费高匿代理抓取

    Golang-Proxy 项目地址: https://github.com/storyicon/golang-proxy Golang-Proxy – 简单高效的免费代理抓取工具通过抓取网络上公开的免 ...

  7. go proxy 快捷的高匿代理抓取工具

    golang-proxy v2.0 Golang-Proxy – 简单高效的免费代理抓取工具通过抓取网络上公开的免费代理,来维护一个属于自己的高匿代理池,用于网络爬虫.资源下载等用途. Version ...

  8. python3 爬虫实战 :用 Appium 抓取手机 app 微信朋友圈的数据

    From:https://blog.csdn.net/Fan_shui/article/details/81413595 本编教程从 appium 的环境配置开始,到抓取手机 app 微信朋友圈结束. ...

  9. python wechatsougou_使用Python的requests库模拟登陆微信搜狗,爬取100X10篇微信文章并保存到MySQL...

    自学的python和爬虫技术.使用到Redis,MySQL数据库:request请求模块:re,Xpath解析模块:dumps, loads序列化和反序列化.还可以配合代理池使用. 爬取的是https ...

最新文章

  1. JavaScript数组方法大全(推荐)
  2. python强类型_python动态性强类型用法实例
  3. ajax 服务器响应,ajax-服务器响应
  4. Android逆向笔记-Proguard混淆Android代码以及去打印日志信息
  5. ef 批量保存 oracle,mybatis-oracle与mysql批量添加
  6. ajax引入html_Vue中发送ajax请求的库有哪些?
  7. Android xml manifest属性详解
  8. Module `react-native-vector-icons/Ionicons` does not exist in the Haste module map
  9. python长度单位转化_所有长度单位的换算
  10. PD4ML将HTML文件转换成PDF文件
  11. 大牛深入讲解!6年老Android面经总结,系列教学
  12. windows下安装nvm教程,nvm use 乱码解决
  13. 《德鲁克管理思想精要》读书笔记3 - 管理的新范式?
  14. 以太坊漏洞分析————4、底层函数误用漏洞
  15. 奇安信渗透测试面试题库_奇安信面试经验
  16. 案例+图解带你一文读懂Canvas【2W字,建议收藏】
  17. javascript实现页面刷新
  18. linux网卡驱动更新方法
  19. Python爬虫实战练习:爬取微信公众号文章
  20. Linux添加Additional Perl modules

热门文章

  1. HNU-电子测试平台与工具-数字密码锁实验报告
  2. 神武手游做任务链服务器维护,神武手游跑环攻略 跑环注意事项详解
  3. 复习步骤12- 16 BPMN事件(3)结束事件
  4. Web前端-JavaScript--对象
  5. xtu1395 字符频度
  6. c语言时钟加秒表报告,51单片机秒表计时器课程设计报告(含C语言程序)-20210419061005.docx-原创力文档...
  7. linux服务器网络不稳定,Linux服务器故障排查指南7:网络缓慢状况
  8. Completed 404 NOT_FOUND,Whitelabel Error Page
  9. Anchor Free系列模型11
  10. matlab 抛物线法求最小值,抛物线法matlab