热门标签 | 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

 


推荐阅读
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 如何从BAM文件绘制ATAC-seq插入片段长度分布图?
    在ATAC-seq数据处理中,插入片段长度的分布图是一个重要的质量控制指标,它能反映出核小体的周期性排列。本文将详细介绍如何从BAM文件中提取并绘制这些数据。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
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社区 版权所有