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

爬虫实例爬取微信公众号文章

网站:http:weixin.sogou.comweixin?type2&querypython&page1实例中含

网站:http://weixin.sogou.com/weixin?type=2&query=python&page=1

实例中含有IP代理池!


爬虫实例爬取微信公众号文章


import requests, re, pymongo, time

from fake_useragent import UserAgent

from urllib.parse import urlencode
from pyquery import PyQuery
from requests.exceptions import ConnectionError


client = pymongo.MongoClient('localhost')
db = client['weixin']

key_word = 'python开发'
connection_count = 0 # 连接列表页失败的次数
connection_detail_count = 0 # 连接列表页失败的次数

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
    'COOKIE': 'CXID=161A70BF2483DEF017E035BBBACD2A81; [email protected]@@@@@@@@@@; SUID=57A70FAB5D68860A5B1E1053000BC731; IPLOC=CN4101; SUV=1528705320668261; pgv_pvi=5303946240; ABTEST=5|1528705329|v1; SNUID=EF1FB713B7B2D9EE6E2A6351B8B3F072; weixinIndexVisited=1; sct=2; SUIR=F607AE0BA0A5CFF9D287956DA129A225; pgv_si=s260076544; JSESSIOnID=aaaILWONRn9wK_OiUhlnw; PHPSESSID=1i38a2ium8e5th2ukhnufua6r1; ppinf=5|1528783576|1529993176|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZToxODolRTklQUQlOTQlRTklOTUlOUN8Y3J0OjEwOjE1Mjg3ODM1NzZ8cmVmbmljazoxODolRTklQUQlOTQlRTklOTUlOUN8dXNlcmlkOjQ0Om85dDJsdUtPQzE0d05mQkJFeUI2d1VJVkhZUE1Ad2VpeGluLnNvaHUuY29tfA; pprdig=ENOZrtvLfoIOct75SgASWxBJb8HJQztLgFbyhRHBfeqrzcirg5WQkKZU2GDCFZ5wLI93Wej3P0hCr_rST0AlvGpF6MY9h24P267oHdqJvgP2DmCHDr2-nYvkLqKs8bjA7PLM1IEHNaH4zK-q2Shcz2A8V5IDw0qEcEuasGxIZQk; sgid=23-35378887-AVsfYtgBzV8cQricMOyk9icd0; ppmdig=15287871390000007b5820bd451c2057a94d31d05d2afff0',
}

def get_proxy():
    try:
        response = requests.get("http://127.0.0.1:5010/get/")
        if response.status_code == 200:
            return response.text
        return None
    except Exception as e:
        print('获取代理异常:',e)
        return None


def get_page_list(url):
    global connection_count
    proxies = get_proxy()
    print('列表页代理:', proxies)

    # 请求url,获取源码
    if proxies != None:
        proxies = {
            'http':'http://'+proxies
        }

    try:
        response = requests.get(url, allow_redirects=False, headers=headers, proxies=proxies)
        if response.status_code == 200:
            print('列表页{}请求成功',url)
            return response.text
        print('状态码:',response.status_code)
        if response.status_code == 302:
            # 切换代理,递归调用当前函数。
            get_page_list(url)
    except ConnectionError as e:
        print('连接对方主机{}失败: {}',url,e)
        connection_count += 1
        if connection_count == 3:
            return None
        # 增加连接次数的判断
        get_page_list(url)


def parse_page_list(html):
    obj = PyQuery(html)
    all_a = obj('.txt-box > h3 > a').items()
    for a in all_a:
        href = a.attr('href')
        yield href


def get_page_detail(url):
    global connection_detail_count
    """
    请求详情页
    :param url: 详情页的url
    :return: 
    """
    proxies = get_proxy()
    print('详情页代理:',proxies)
    # 请求url,获取源码
    if proxies != None:
        proxies = {
            'http': 'http://' + proxies
        }

    try:
        # 注意:将重定向allow_redirects=False删除。列表页是https verify=False,
        # 注意:将重定向allow_redirects=False删除。列表页是https verify=False,
        # 注意:将重定向allow_redirects=False删除。列表页是https verify=False,
        # 注意:将重定向allow_redirects=False删除。列表页是https verify=False,
        response = requests.get(url, headers=headers, verify=False, proxies=proxies)
        if response.status_code == 200:
            print('详情页{}请求成功', url)
            return response.text
        else:
            print('状态码:', response.status_code,url)
            # 切换代理,递归调用当前函数。
            get_page_detail(url)
    except ConnectionError as e:
        print('连接对方主机{}失败: {}', url, e)
        connection_detail_count += 1
        if connection_detail_count == 3:
            return None
        # 增加连接次数的判断
        get_page_detail(url)

def parse_page_detail(html):
    obj = PyQuery(html)
    # title = obj('#activity-name').text()
    info = obj('.profile_inner').text()
    weixin = obj('.xmteditor').text()

    print('info')

    return {
        'info':info,
        'weixin':weixin
    }


def save_to_mongodb(data):
    # insert_one: 覆盖式的
    db['article'].insert_one(data)

    # 更新的方法:
    # 参数1:指定根据什么字段去数据库中进行查询,字段的值。
    # 参数2:如果经过参数1的查询,查询到这条数据,执行更新的操作;反之,执行插入的操作;$set是一个固定的写法。
    # 参数3:是否允许更新
    db['article'].update_one({'info': data['info']}, {'$set': data}, True)
    time.sleep(1)


def main():
    for x in range(1, 101):
        url = 'http://weixin.sogou.com/weixin?query={}&type=2&page={}'.format(key_word, 1)
        html = get_page_list(url)
        if html != None:
            # 详情页的url
            urls = parse_page_list(html)
            for url in urls:
                detail_html = get_page_detail(url)
                if detail_html != None:
                    data = parse_page_detail(detail_html)
                    if data != None:
                        save_to_mongodb(data)


if __name__ == '__main__':
    main()


推荐阅读
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • Hello.js 是一个用于连接OAuth2服务的JavascriptRESTFULAPI库,如Go ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了常用#免费%代理IP库&整理*收藏——实时@更新(大概)相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 基于STM32的智能循迹小车设计(基础版)
    基于STM32的智能循迹小车设计(基础版)硬件准备1、小车底盘+四直流电机(带轮)2、STM32F103C8T6核心板3、12V8700mAh锂电池(可以用几节18650锂电池)4 ... [详细]
  • 前端简史之纵横:Node东出
    引💡Ajax的出现,带来了jQuery时代,而jQuery时代也伴随着Node风暴淡淡退出了历史舞台。如果说Ajax给前端带来了从网页静 ... [详细]
author-avatar
萱恭俊逸明靖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有