首页 > 电脑专区 > 微信教程 >

如何使用Scrapy爬取微信公众号的文章列表及链接

来源:互联网 2023-02-21 17:48:28 307

本文会结合Python的爬虫框架Scrapy 和 微信搜索引擎进行微信公众号上的文章搜索爬取,并将爬取到的文章标题以及文章的链接保存到Excel文件中,同时将结果文件通过email发送到自己的邮箱中。JCf办公区 - 实用经验教程分享!

工具/原料

  • Python3
  • Scrapy

创建微信公众号爬虫工程的基本框架

  • 1

    使用Scrapy命令创建爬虫的基本框架代码JCf办公区 - 实用经验教程分享!

    scrapy startproject wechatFishmanJCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 1该信息未经许可获取自百度经验
  • 2

    使用Scrapy命令生存爬虫的的主类文件JCf办公区 - 实用经验教程分享!

    scrapy genspider wechatFishman mp.weixin.qq.comJCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 安装相关的python依赖包

  • 1

    安装python Excel处理包JCf办公区 - 实用经验教程分享!

    使用如下命令进行安装:JCf办公区 - 实用经验教程分享!

    sudo -H pip install openpyxlJCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 分析搜狗微信搜索的网页结构

  • 1

    打开搜狗选择微信搜索选项进行搜索JCf办公区 - 实用经验教程分享!

    在搜索栏输入“智慧城管”关键词进行搜索,我们就可以看到在微信上的相关文章列表JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 2

    搜索网址爬取策略分析JCf办公区 - 实用经验教程分享!

    1. 搜索URL需要带Type 参数:微信搜索时type =2JCf办公区 - 实用经验教程分享!

    2. 搜索URL的关键词query参数:网址中我们可以直接将搜索关键词作为query的参数JCf办公区 - 实用经验教程分享!

    3. 在进行爬虫时可以不需要其他参数JCf办公区 - 实用经验教程分享!

    分析后我们在爬虫中需要访问的URL连接样例如下:JCf办公区 - 实用经验教程分享!

    http://weixin.sogou.com/weixin?type=2&query=智慧城管JCf办公区 - 实用经验教程分享!

  • 3

    搜索结果爬取策略分析JCf办公区 - 实用经验教程分享!

    1. 上一个步骤我们得到一个查询结果的页面JCf办公区 - 实用经验教程分享!

    2. 查看查询结果页面的源代码,可以发现文章列表都在JCf办公区 - 实用经验教程分享!

    ul class="news-list"> /ul>里面JCf办公区 - 实用经验教程分享!

    3.文章列表css定位:JCf办公区 - 实用经验教程分享!

    div class="txt-box">内的a>元素中JCf办公区 - 实用经验教程分享!

    所以我们可以通过 ul -> div ->a 的顺序定位文章的列表以及连接JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 4

    搜索结果下一页的爬取策略分析JCf办公区 - 实用经验教程分享!

    1.下一页的按钮对应的源代码如下:JCf办公区 - 实用经验教程分享!

    a id="sogou_next" href="?query=智慧城管&_sug_type_=&sut=2307&lkt=1,1533556190561,1533556190561&s_from=input&_sug_=n&type=2&sst0=1533556190663&page=2&ie=utf8&w=01019900&dr=1" class="np" uigs="page_next">下一页/a>JCf办公区 - 实用经验教程分享!

    2. 我们可以共同 a id="sogou_next">进行定位,找到下一页的URL地址进行爬取JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 编写爬虫关键代码

  • 1

    WechatfishSpider.py 主文件JCf办公区 - 实用经验教程分享!

    # -*- coding: utf-8 -*-JCf办公区 - 实用经验教程分享!

    import scrapyJCf办公区 - 实用经验教程分享!

    from wechatFishman.items import WechatfishmanItemJCf办公区 - 实用经验教程分享!

    from selenium import webdriverJCf办公区 - 实用经验教程分享!

    from bs4 import BeautifulSoup as bs4JCf办公区 - 实用经验教程分享!

    import timeJCf办公区 - 实用经验教程分享!

    import wechatFishman.settings as settingsJCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    class WechatfishSpider(scrapy.Spider):JCf办公区 - 实用经验教程分享!

    name = 'wechatFish'JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    key_word=settings.SUBJECT_KEY_WORDSJCf办公区 - 实用经验教程分享!

    allowed_domains = ['mp.weixin.qq.com','weixin.sogou.com','mmbiz.qpic.cn']JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    start_urls = ['http://weixin.sogou.com/weixin?type=2&query=%s&ie=utf8' %key_word]JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    def parse(self, response):JCf办公区 - 实用经验教程分享!

    print("\n")JCf办公区 - 实用经验教程分享!

    print("***********parse spider***************")JCf办公区 - 实用经验教程分享!

    wechat_item = WechatfishmanItem()JCf办公区 - 实用经验教程分享!

    driver = webdriver.PhantomJS()JCf办公区 - 实用经验教程分享!

    driver.get(response.url)JCf办公区 - 实用经验教程分享!

    #time sleep is very import to load the urlJCf办公区 - 实用经验教程分享!

    time.sleep(30)JCf办公区 - 实用经验教程分享!

    soup = bs4(driver.page_source,'html.parser')JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    news_list=soup.find_all('ul', {'class':'news-list'})JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    for news_item in news_list:JCf办公区 - 实用经验教程分享!

    txt_box_list = news_item.find_all('div', {'class':'txt-box'})JCf办公区 - 实用经验教程分享!

    for txt_box in txt_box_list:JCf办公区 - 实用经验教程分享!

    news_href=txt_box.find('a')JCf办公区 - 实用经验教程分享!

    wechat_item["file_name"] = news_href.get_text().strip()JCf办公区 - 实用经验教程分享!

    print("******************\n")JCf办公区 - 实用经验教程分享!

    print("title :%s" % wechat_item["file_name"])JCf办公区 - 实用经验教程分享!

    wechat_item["file_url"] = news_href.get("href")JCf办公区 - 实用经验教程分享!

    print("href :%s" % wechat_item["file_name"])JCf办公区 - 实用经验教程分享!

    yield wechat_itemJCf办公区 - 实用经验教程分享!

    #for prevision pageJCf办公区 - 实用经验教程分享!

    next_page=soup.find('a',{"id":'sogou_next'})JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    if next_page:JCf办公区 - 实用经验教程分享!

    if len(next_page) == 0:JCf办公区 - 实用经验教程分享!

    print("\n-------->Finished the spider")JCf办公区 - 实用经验教程分享!

    returnJCf办公区 - 实用经验教程分享!

    next_page_link = next_page.get("href")JCf办公区 - 实用经验教程分享!

    if next_page_link:JCf办公区 - 实用经验教程分享!

    #the last elementJCf办公区 - 实用经验教程分享!

    next_page_link = "http://weixin.sogou.com/weixin" next_page_linkJCf办公区 - 实用经验教程分享!

    yield scrapy.Request(next_page_link, callback=self.parse)JCf办公区 - 实用经验教程分享!

    else:JCf办公区 - 实用经验教程分享!

    print("\n-------->No More Page")JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    driver.quit()JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 2

    WechatfishmanItem.py:爬取结果项定义类JCf办公区 - 实用经验教程分享!

    import scrapyJCf办公区 - 实用经验教程分享!

    class WechatfishmanItem(scrapy.Item):JCf办公区 - 实用经验教程分享!

    # define the fields for your item here like:JCf办公区 - 实用经验教程分享!

    file_name = scrapy.Field()JCf办公区 - 实用经验教程分享!

    file_url = scrapy.Field()JCf办公区 - 实用经验教程分享!

  • 3

    settings.py 打开中间件以及配置相关的常量值JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    FILE_SAVE_DIR='/home/hxb/wechat'JCf办公区 - 实用经验教程分享!

    SUBJECT_FILE_NAME='深度学习'JCf办公区 - 实用经验教程分享!

    SUBJECT_KEY_WORDS='深度学习'JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    ITEM_PIPELINES = {JCf办公区 - 实用经验教程分享!

    'wechatFishman.pipelines.WechatfishmanPipeline': 1,JCf办公区 - 实用经验教程分享!

    }JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 4

    爬取结果处理类:WechatfishmanPipelineJCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    # -*- coding: utf-8 -*-JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    import wechatFishman.settings as settingsJCf办公区 - 实用经验教程分享!

    from openpyxl import WorkbookJCf办公区 - 实用经验教程分享!

    from openpyxl import load_workbookJCf办公区 - 实用经验教程分享!

    import osJCf办公区 - 实用经验教程分享!

    import datetimeJCf办公区 - 实用经验教程分享!

    import smtplibJCf办公区 - 实用经验教程分享!

    from email.mime.text import MIMETextJCf办公区 - 实用经验教程分享!

    from email.mime.multipart import MIMEMultipartJCf办公区 - 实用经验教程分享!

    from scrapy.xlib.pydispatch import dispatcherJCf办公区 - 实用经验教程分享!

    from scrapy import signalsJCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    class WechatfishmanPipeline(object):JCf办公区 - 实用经验教程分享!

    row_index = 0JCf办公区 - 实用经验教程分享!

    file_path = settings.FILE_SAVE_DIR "/" settings.SUBJECT_FILE_NAME "-" datetime.date.today().strftime('%Y%m%d') ".xlsx"JCf办公区 - 实用经验教程分享!

    def __init__(self):JCf办公区 - 实用经验教程分享!

    dispatcher.connect(self.spider_closed,signals.spider_closed)JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    def process_item(self, item, spider):JCf办公区 - 实用经验教程分享!

    print("***********WeChatFish Pipeline**************\n")JCf办公区 - 实用经验教程分享!

    print("---------->save:%s" %item['file_name'])JCf办公区 - 实用经验教程分享!

    dir_path="/home/hxb/wechat"JCf办公区 - 实用经验教程分享!

    self.save_xls(item['file_name'],item['file_url'])JCf办公区 - 实用经验教程分享!

    return itemJCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    def spider_closed(self,spider):JCf办公区 - 实用经验教程分享!

    print("\n--------------->closed spider")JCf办公区 - 实用经验教程分享!

    self.send_mail(self.file_path)JCf办公区 - 实用经验教程分享!

    def save_xls(self,name,url):JCf办公区 - 实用经验教程分享!

    print("\n******>Save to File %s" %self.file_path)JCf办公区 - 实用经验教程分享!

    if not os.path.exists(self.file_path):JCf办公区 - 实用经验教程分享!

    wb = Workbook()JCf办公区 - 实用经验教程分享!

    ws = wb.activeJCf办公区 - 实用经验教程分享!

    ws.append(["Title","URL Link"])JCf办公区 - 实用经验教程分享!

    self.row_index = self.row_index 1 JCf办公区 - 实用经验教程分享!

    wb.save(self.file_path)JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    load_wb = load_workbook(self.file_path)JCf办公区 - 实用经验教程分享!

    ws = load_wb.activeJCf办公区 - 实用经验教程分享!

    self.row_index = self.row_index 1JCf办公区 - 实用经验教程分享!

    ws.cell(self.row_index,1).value = nameJCf办公区 - 实用经验教程分享!

    ws.cell(self.row_index,1).hyperlink = urlJCf办公区 - 实用经验教程分享!

    ws.cell(self.row_index,2).value = urlJCf办公区 - 实用经验教程分享!

    ws.cell(self.row_index,2).hyperlink = urlJCf办公区 - 实用经验教程分享!

    load_wb.save(self.file_path)JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    def send_mail(self,file):JCf办公区 - 实用经验教程分享!

    mail_host = 'smtp.163.com'JCf办公区 - 实用经验教程分享!

    msg = MIMEMultipart('related')JCf办公区 - 实用经验教程分享!

    msg['Subject'] = 'WeChat Spider result from'JCf办公区 - 实用经验教程分享!

    msg['From'] = 'aaa@163.com'JCf办公区 - 实用经验教程分享!

    #to_list = ['xxx@xxx.com','aaa@bbb.com','ccc@sss.com']JCf办公区 - 实用经验教程分享!

    to_list= ['xxx@aaa.com']JCf办公区 - 实用经验教程分享!

    msg['To']=','.join(to_list)JCf办公区 - 实用经验教程分享!

    msg_doc = MIMEText(open(file,'rb').read(),'base64','utf8')JCf办公区 - 实用经验教程分享!

    msg_doc.add_header('content-disposition','attachment',filename=settings.SUBJECT_FILE_NAME datetime.date.today().strftime('%Y%m%d') ".xlsx")JCf办公区 - 实用经验教程分享!

    msg.attach(msg_doc)JCf办公区 - 实用经验教程分享!

    smtp = smtplib.SMTP(mail_host,25)JCf办公区 - 实用经验教程分享!

    smtp.login('aaa@163.com','vicent$1981')JCf办公区 - 实用经验教程分享!

    smtp.sendmail('aaa@163.com','aaa@ccc.com',msg.as_string())JCf办公区 - 实用经验教程分享!

    JCf办公区 - 实用经验教程分享!

    smtp.quit()JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 运行爬虫获取内容

  • 1

    使用scrapy命令运行创建的爬虫:JCf办公区 - 实用经验教程分享!

    scrapy crawl wchatFishJCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 2

    查看爬虫结果JCf办公区 - 实用经验教程分享!

    在我们设定的目录可以看到生成的爬虫文件JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

    如何使用Scrapy爬取微信公众号的文章列表及链接JCf办公区 - 实用经验教程分享!

  • 3

    在邮箱中我们也可以到爬虫发送过来的excel结果文件JCf办公区 - 实用经验教程分享!

  • 注意事项

    • 爬取时需要间隔一定的时间,否则会触发搜狗的发爬虫措施导致无法爬取信息

    以上方法由办公区教程网摘抄自百度经验可供大家参考!JCf办公区 - 实用经验教程分享!


    标签: 微信

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码