[Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章

  借助搜索微信搜索引擎进行抓取

  抓取过程

  1、首先在搜狗的微信搜索页面测试一下,这样能够让我们的思路更加清晰

  

    在搜索引擎上使用微信公众号英文名进行“搜公众号”操作(因为公众号英文名是公众号唯一的,而中文名可能会有重复,同时公众号名字一定要完全正确,不然可能搜到很多东西,这样我们可以减少数据的筛选工作,

    只要找到这个唯一英文名对应的那条数据即可),即发送请求到‘http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&_sug_=n&_sug_type_= ‘ %  ‘Python‘,并从页面中解析出搜索结果公众号对应的主页跳转链接。

    

  在抓取过程中用到了pyquery 也可以用xpath

  

  文件保存:

  

  完整代码如下:

  

# coding: utf-8# 这三行代码是防止在python2上面编码错误的,在python3上面不要要这样设置import sysreload(sys)sys.setdefaultencoding(‘utf-8‘)from urllib import quotefrom pyquery import PyQuery as pqfrom selenium import webdriverfrom pyExcelerator import *  # 导入excel相关包

import requestsimport timeimport reimport jsonimport os

class wx_spider:    def __init__(self,Wechat_PublicID):        ‘‘‘        构造函数,借助搜狗微信搜索引擎,根据微信公众号获取微信公众号对应的文章的,发布时间、文章标题, 文章链接, 文章简介等信息        :param Wechat_PublicID: 微信公众号        ‘‘‘        self.Wechat_PublicID = Wechat_PublicID        #搜狗引擎链接url        self.sogou_search_url = ‘http://weixin.sogou.com/weixin?type=1&query=%s&ie=utf8&s_from=input&_sug_=n&_sug_type_=‘ % quote(Wechat_PublicID)

        # 爬虫伪装头部设置        self.headers = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0‘}

        # 超时时长        self.timeout = 5

        # 爬虫模拟在一个request.session中完成        self.session = requests.Session()

        # excel 第一行数据        self.excel_headData = [u‘发布时间‘, u‘文章标题‘, u‘文章链接‘, u‘文章简介‘]

        # 定义excel操作句柄        self.excle_Workbook = Workbook()

    def log(self, msg):        ‘‘‘        日志函数        :param msg: 日志信息        :return:        ‘‘‘        print u‘%s: %s‘ % (time.strftime(‘%Y-%m-%d %H-%M-%S‘), msg)

    def run(self):

        #Step 0 :  创建公众号命名的文件夹        if not os.path.exists(self.Wechat_PublicID):            os.makedirs(self.Wechat_PublicID)

        # 第一步 :GET请求到搜狗微信引擎,以微信公众号英文名称作为查询关键字        self.log(u‘开始获取,微信公众号英文名为:%s‘ % self.Wechat_PublicID)        self.log(u‘开始调用sougou搜索引擎‘)

        self.log(u‘搜索地址为:%s‘ % self.sogou_search_url)        sougou_search_html = self.session.get(self.sogou_search_url, headers=self.headers, timeout=self.timeout).content

        # 第二步:从搜索结果页中解析出公众号主页链接        doc = pq(sougou_search_html)        # 通过pyquery的方式处理网页内容,类似用beautifulsoup,但是pyquery和jQuery的方法类似,找到公众号主页地址        wx_url = doc(‘div[class=txt-box]‘)(‘p[class=tit]‘)(‘a‘).attr(‘href‘)        self.log(u‘获取wx_url成功,%s‘ % wx_url)

        # 第三步:Selenium+PhantomJs获取js异步加载渲染后的html        self.log(u‘开始调用selenium渲染html‘)        browser = webdriver.PhantomJS()        browser.get(wx_url)        time.sleep(3)        # 执行js得到整个页面内容        selenium_html = browser.execute_script("return document.documentElement.outerHTML")        browser.close()

        # 第四步: 检测目标网站是否进行了封锁        ‘ 有时候对方会封锁ip,这里做一下判断,检测html中是否包含id=verify_change的标签,有的话,代表被重定向了,提醒过一阵子重试 ‘        if pq(selenium_html)(‘#verify_change‘).text() != ‘‘:            self.log(u‘爬虫被目标网站封锁,请稍后再试‘)        else:            # 第五步: 使用PyQuery,从第三步获取的html中解析出公众号文章列表的数据            self.log(u‘调用selenium渲染html完成,开始解析公众号文章‘)            doc = pq(selenium_html)

            articles_list = doc(‘div[class="weui_media_box appmsg"]‘)            articlesLength = len(articles_list)            self.log(u‘抓取到微信文章%d篇‘ % articlesLength)

            # Step 6: 把微信文章数据封装成字典的list            self.log(u‘开始整合微信文章数据为字典‘)

            # 遍历找到的文章,解析里面的内容            if articles_list:                index = 0

                # 以当前时间为名字建表                excel_sheet_name = time.strftime(‘%Y-%m-%d‘)                excel_content = self.excle_Workbook.add_sheet(excel_sheet_name)                colindex = 0                columnsLength = len(self.excel_headData)                for data in self.excel_headData:                    excel_content.write(0, colindex, data)                    colindex += 1                for article in articles_list.items():                    self.log(‘ ‘ )                    self.log(u‘开始整合(%d/%d)‘ % (index, articlesLength))                    index += 1                    # 处理单个文章                    # 获取标题                    title = article(‘h4[class="weui_media_title"]‘).text().strip()                    self.log(u‘标题是: %s‘ % title)                    # 获取标题对应的地址                    url = ‘http://mp.weixin.qq.com‘ + article(‘h4[class="weui_media_title"]‘).attr(‘hrefs‘)                    self.log(u‘地址为: %s‘ % url)                    # 获取概要内容                    # summary = article(‘.weui_media_desc‘).text()                    summary = article(‘p[class="weui_media_desc"]‘).text()                    self.log(u‘文章简述: %s‘ % summary)                    # 获取文章发表时间                    # date = article(‘.weui_media_extra_info‘).text().strip()                    date = article(‘p[class="weui_media_extra_info"]‘).text().strip()                    self.log(u‘发表时间为: %s‘ % date)                    # # 获取封面图片                    # pic = article(‘.weui_media_hd‘).attr(‘style‘)                    #                    # p = re.compile(r‘background-image:url(.+)‘)                    # rs = p.findall(pic)                    # if len(rs) > 0:                    #     p = rs[0].replace(‘(‘, ‘‘)                    #     p = p.replace(‘)‘, ‘‘)                    #     self.log(u‘封面图片是:%s ‘ % p)                    tempContent = [date, title, url, summary]                    for j in range(columnsLength):                        excel_content.write(index, j, tempContent[j])

                    self.excle_Workbook.save(self.Wechat_PublicID + ‘/‘ + self.Wechat_PublicID + ‘.xlsx‘)

            self.log(u‘保存完成,程序结束‘)

if __name__ == ‘__main__‘:

    wx_spider("python6359").run()

  

时间: 2024-10-06 00:47:23

[Python爬虫] 之十五:Selenium +phantomjs根据微信公众号抓取微信文章的相关文章

[Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动(多线程抓取)

延续上个抓取活动行中会议活动的问题,上次使用是单线程的抓取,效率较低,现在使用多线程的抓取. 数据的抓取分为两个过程:首先获取每个关键字搜索结果对应的url和页数,保存在列表里面,这个过程用一个线程来实现(类似生产者),同时根据获取的关键字的url和页数,抓取对应的数据,这个过程用多线程来抓取(类似消费者) 这样整个抓取过程共用了144.366188 秒,采用单线程来进行抓取要用大概184秒,这样大概节省了40秒 具体代码如下: # coding=utf-8import osimport ref

九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import json import random import re import urllib.error def hq_html(hq_url): """ hq_html()封装的爬虫函数,自动启用了用户代理和ip代理 接收一个参数url,要爬取页面的url,返回html源码 "

[Python爬虫] 之十三:Selenium +phantomjs抓取活动树会议活动数据

抓取活动树网站中会议活动数据(http://www.huodongshu.com/html/index.html) 具体的思路是[Python爬虫] 之十一中抓取活动行网站的类似,都是用多线程来抓取,但是由于活动树网站 ,每个关键字搜索页的ur是固定,比如搜索“数字”结果有470个结果,没页10条记录,第二页的url和第一页的 url是一样的. 因此针对每个关键字用一个线程进行搜索. 具体代码如下: # coding=utf-8import osimport refrom selenium im

[Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)

思路是这样的,给一系列关键字:互联网电视:智能电视:数字:影音:家庭娱乐:节目:视听:版权:数据等.在活动行网站搜索页(http://www.huodongxing.com/search?city=%E5%85%A8%E5%9B%BD&pi=1)的文本输入框中分别输入每个关键字,在搜索结果中抓取需要的数据. 首先通过Selenium+IE驱动得到每个关键字搜索结果的url(首页,因为以后各个页的url就是索引不一样)和总页数,保存的列表里面.然后再循环列表,用Selenium +phantomj

[Python爬虫] 之十一:Selenium +phantomjs抓取活动树中会议活动

最近在抓取活动树网站 (http://www.huodongshu.com/html/find.html) 上数据时发现,在用搜索框输入中文后,点击搜索,phantomjs抓取数据怎么也抓取不到,但是用IE驱动就可以找,后来才发现了原因. 例如URL: http://www.huodongshu.com/html/find_search.html?search_keyword=数字, phantomjs抓取的内存中url变成了http://www.huodongshu.com/html/find

Python爬虫框架Scrapy 学习笔记 10.3 -------【实战】 抓取天猫某网店所有宝贝详情

第三部分 替换默认下载器,使用selenium下载页面 对详情页稍加分析就可以得出:我们感兴趣的大部分信息都是由javascript动态生成的,因此需要先在浏览器中执行javascript代码,再从最终的页面上抓取信息(当然也有别的解决方案). scrapy 本身提供了 Middleware机制.利用Dowloader Middleware可以改变默认的request对象和reponse对象,甚至替换默认的下载器.(可以对比JavaEE中的Filter理解Middleware) scrapy 架

Python爬虫新手教程:微医挂号网医生数据抓取

1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做准备.本篇文章主要使用的库为pyppeteer 和 pyquery 首先找到 医生列表页 https://www.guahao.com/expert/all/全国/all/不限/p5 这个页面显示有 75952 条数据 ,实际测试中,翻页到第38页,数据就加载不出来了,目测后台程序猿没有把数据返回,

Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy

爬前叨叨 缘由 今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的.... 爬取网址 http://cgk.kxjs.tj.gov.cn/navigation.do 有很明显的分页表示 列表如下 Request URL: http://cgk.kxjs.tj.gov.cn/navigation.do Request Method: POST 参数说明,里面两个比较重要

【Rollo的Python之路】Python 爬虫系统学习 (五) Selenium

Selenium 与 PhantomJS selenium:[s??li?ni?m]:# n. 硒(化学元素,用于制造电气设备和有色玻璃,人体缺此元素可致抑郁等病) phantom:[?fænt?m] :# n. 鬼; 鬼魂; 幽灵; 幻觉; 幻象; adj. 像鬼的; 幽灵似的; 幻觉的; 幻象的; 虚幻的 Selenium Selenium 是一个web的自动化测试工具,最初是为了网站自动化测试而开发的,Selenium可以直接运行在浏览器上,它支持所有主流的(包括PhantomJS这些无界