热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

代理IP爬取微信公众号文章

1#!usrbinenvpython2#_*_coding:utf8_*_3#--Author--Tokay45@author:Tokay
  1 #!/usr/bin/env python
  2 #_*_ coding:utf8 _*_
  3 #--Author--Tokay
  4 '''
  5 @author:Tokay
  6 @file:spider
  7 @time:2018/11/28
  8 '''
  9 from urllib.parse import urlencode
 10 import pymongo
 11 import requests
 12 from lxml.etree import XMLSyntaxError
 13 from requests.exceptions import ConnectionError
 14 from pyquery import PyQuery as pq
 15 from wx_config import *
 16 
 17 #链接数据库
 18 client = pymongo.MongoClient(MONGO_URI)
 19 db = client[MONGO_DB]
 20 
 21 #原始URL
 22 base_url = 'https://weixin.sogou.com/weixin?'
 23 
 24 #拼接headers信息
 25 #COOKIE最好先登录一次在去获取,未使用COOKIE池
 26 headers = {
 27     'COOKIE': 'SUV=0094174DB715E6585BC3FE1950711692; IPLOC=CN4401; SUID=C34B43713020910A000000005BD32129; LSTMV=202%2C283; LCLKINT=5345; ABTEST=0|1543369487|v1; SNUID=AD70B5A49F9AE530288B692F9F14FD61; weixinIndexVisited=1; JSESSIOnID=aaaMTOQg0EtK5c_Cex6Cw; sct=3; ppinf=5|1543387462|1544597062|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZTo1NDolRTclODglQjElRTUlOTAlODMlRTUlQTUlQjYlRTklODUlQUElRTclOUElODQlRTclOEMlQUJ8Y3J0OjEwOjE1NDMzODc0NjJ8cmVmbmljazo1NDolRTclODglQjElRTUlOTAlODMlRTUlQTUlQjYlRTklODUlQUElRTclOUElODQlRTclOEMlQUJ8dXNlcmlkOjQ0Om85dDJsdUU3bG9rMWRsZkNNQVlka0VpWG9RRVVAd2VpeGluLnNvaHUuY29tfA; pprdig=JKiXOcRXslMUmqXyhN4ENi34_21yRh3DY84w1kXR9Rb34hQnBMY1JaWAygtf5rXz4CkKDJZM7IHylX86NGMR50RTG6NkICyfLzW2X5WIYCRRibfbehUItjTstuTJrfa9GBBT9EchpL_2qznzCXx8qU6ib_qQ4qzSDmMik-FK2Ns; sgid=02-36042859-AVvibOUYdic0W5tKL5W0hCiaqs; ppmdig=1543387462000000463e66125f125b9f2459029a31ff01dc',
 28     'Host': 'weixin.sogou.com',
 29     'Upgrade-Insecure-Requests': '1',
 30     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
 31 }
 32 
 33 proxy = None
 34 
 35 #获取代理IP
 36 def get_proxy():
 37     try:
 38         respOnse= requests.get(PROXY_POOL_URL)
 39         if response.status_code == 200:
 40             return response.text
 41         return None
 42     except ConnectionError as ec:
 43         print(ec.args)
 44         return None
 45 
 46 
 47 #获取网页
 48 def get_html(url,count=1):
 49     print('获取的',url)
 50     print('数量',count)
 51     global proxy
 52     if count >= MAX_COUNT:
 53         print('最大统计数')
 54         return None
 55     try:
 56         if proxy:
 57             proxies = {
 58                 'http': 'http://' + proxy
 59             }
 60             respOnse= requests.get(url,allow_redirects=False,headers=headers,proxies=proxies)
 61         else:
 62             respOnse= requests.get(url, allow_redirects=False, headers=headers)
 63             if response.status_code == 200:
 64                 return response.text
 65             if response.status_code == 302:
 66                 #更换IP
 67                 print('302错误正在更换IP')
 68                 proxy = get_proxy()
 69                 if proxy:
 70                     print('正在使用proxy',proxy)
 71                     return get_html(url)
 72                 else:
 73                     print('获取代理失败')
 74                     return None
 75     except ConnectionError as ec:
 76         print('链接错误',ec.args)
 77         proxy = get_proxy()
 78         count += 1
 79         return get_html(url,count)
 80 
 81 #获取页面信息
 82 def get_index(keyword,page):
 83     data = {
 84         'query': keyword,
 85         'type': 2,
 86         'page': page
 87     }
 88     queries = urlencode(data)
 89     url = base_url + queries
 90     html = get_html(url)
 91     return html
 92 
 93 #解析页面信息
 94 def parse_index(html):
 95 
 96     doc = pq(html)
 97     items = doc('.news-box .news-list .txt-box h3 a').items()
 98     for item in items:
 99         yield item.attr('href')
100 
101 #获取详情页
102 def get_detail(url):
103     try:
104         respOnse= requests.get(url)
105         if response.status_code == 200:
106             return response.text
107         return None
108     except ConnectionError as ec:
109         print('获取详情页错误')
110         return None
111 
112 #解析详情页
113 def parse_detail(html):
114     try:
115         doc = pq(html)
116         title = doc('.rich_media_title').text()
117         cOntent= doc('.rich_media_content ').text()
118         date = doc('#publish_time').text()
119         nickname = doc('.rich_media_meta_list .rich_media_meta_nickname').text()
120         wechat = doc('#js_profile_qrcode > div > p:nth-child(3) > span').text()
121         return {
122             'title': title,
123             'content': content,
124             'date': date,
125             'nickname': nickname,
126             'wechat': wechat
127         }
128     except XMLSyntaxError:
129         print('解析详情页失败')
130         return None
131 #存入mongodb
132 def save_to_mondb(data):
133     if db['articles'].update({'title':data['title']},{'$set':data},True):
134         print('正在存储到数据库',data['title'])
135     else:
136         print('正在存储到数据库发生错误', data['title'])
137 def main():
138     for page in range(1,101):
139         html = get_index(KEYWORD, page)
140         if html:
141             article_urls = parse_index(html)
142             for article_url in article_urls:
143                 article_html = get_detail(article_url)
144                 if article_html:
145                     artticle_data = parse_detail(article_html)
146                     print(artticle_data)
147                     if artticle_data:
148                         save_to_mondb(artticle_data)
149 
150 if __name__ == '__main__':
151     main()
#ip代理池
PROXY_POOL_URL = 'http://127.0.0.1:5000/get'
#搜索关键词
KEYWORD = '东京食种'
#mongo连接地址
MONGO_URI = 'localhost'
#数据库名
MONGO_DB = 'weixin_Tokay'
#最大统计数
MAX_COUNT = 5

 


推荐阅读
  • 在本文中,我们将探讨如何使用 UniApp 封装小程序 API 请求接口的最佳实践。通过创建 `request.js` 文件,定义基础 URL 并传入后端提供的 URL 作为请求参数。同时,配置请求方法(如 GET、POST)和请求头(例如包含 token 的认证信息),以实现高效、安全的 API 调用。此外,我们还将介绍如何处理请求和响应的错误,以及如何优化请求性能,确保应用在不同平台上的兼容性和稳定性。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • Liferay Portal 中 AutoEscape 构造函数的应用与实例代码解析 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • SpringBoot启动脚本详解:BAT文件应用与基础入门指南(SpringBoot系列第1篇)
    如果你还在为SSM框架的复杂搭建过程和繁琐的配置文件而烦恼,那么SpringBoot将是你的一大福音。作为SpringBoot系列的第一篇文章,本文详细介绍了如何使用BAT文件来启动SpringBoot应用,并提供了基础入门指南,帮助开发者快速上手,简化开发流程。 ... [详细]
  • 本文详细介绍了如何在 Grafana 中独立于 Alertmanager 配置邮件和微信告警。具体步骤包括配置 SMTP 服务器以实现邮件告警,以及设置微信告警的集成方式。通过这些配置,用户可以更灵活地管理和接收来自 Grafana 的告警通知,确保及时响应系统异常。文章还提供了详细的配置示例和常见问题的解决方案,帮助用户顺利完成设置。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • 在进行前端JavaScript国际化(i18n)的过程中,为了从cookie中获取语言信息并动态加载相应资源,我决定将语言检测逻辑和i18n初始化代码直接嵌入到index页面中,使用了Velocity模板引擎的语法。这种方法不仅简化了代码结构,还提高了语言切换的灵活性和响应速度。 ... [详细]
author-avatar
梁梁庆新
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有