如何使用Scrapy爬取微信公眾號的文章列表及連結

本文會結合Python的爬蟲框架Scrapy 和 微信搜尋引擎進行微信公眾號上的文章搜尋爬取,並將爬取到的文章標題以及文章的連結保存到Excel文件中,同時將結果文件通過email發送到自己的郵箱中。

工具/原料

Python3
Scrapy

創建微信公眾號爬蟲工程的基本框架

使用Scrapy命令創建爬蟲的基本框架代碼

scrapy startproject wechatFishman

使用Scrapy命令生存爬蟲的的主類文件

scrapy genspider wechatFishman mp.weixin.qq.com

安裝相關的python依賴包

安裝python Excel處理包

使用如下命令進行安裝:

sudo -H pip install openpyxl

分析搜狗微信搜尋的網頁結構

打開搜狗選擇微信搜尋選項進行搜尋

在搜尋欄輸入「智慧城管」關鍵詞進行搜尋,我們就可以看到在微信上的相關文章列表

搜尋網址爬取策略分析

1. 搜尋URL需要帶Type 參數:微信搜尋時type =2

2. 搜尋URL的關鍵詞query參數:網址中我們可以直接將搜尋關鍵詞作為query的參數

3. 在進行爬蟲時可以不需要其他參數

分析後我們在爬蟲中需要訪問的URL連接樣例如下:

http://weixin.sogou.com/weixin?type=2&query=智慧城管

搜尋結果爬取策略分析

1. 上一個步驟我們得到一個查詢結果的頁面

2. 查看查詢結果頁面的原始碼,可以發現文章列表都在

<ul class="news-list"> </ul>裡面

3.文章列表css定位:

<div class="txt-box">內的<a>元素中

所以我們可以通過  ul -> div ->a 的順序定位文章的列表以及連接

搜尋結果下一頁的爬取策略分析

1.下一頁的按鈕對應的原始碼如下:

<a id="sogou_next" href="?query=%E6%99%BA%E6%85%A7%E5%9F%8E%E7%AE%A1&_sug_type_=&sut=2307&lkt=1%2C1533556190561%2C1533556190561&s_from=input&_sug_=n&type=2&sst0=1533556190663&page=2&ie=utf8&w=01019900&dr=1" class="np" uigs="page_next">下一頁</a>

2. 我們可以共同 <a id="sogou_next">進行定位,找到下一頁的URL地址進行爬取

編寫爬蟲關鍵代碼

WechatfishSpider.py 主文件

# -*- coding: utf-8 -*-

import scrapy

from wechatFishman.items import WechatfishmanItem

from selenium import webdriver

from bs4 import BeautifulSoup as bs4

import time

import wechatFishman.settings as settings

class WechatfishSpider(scrapy.Spider):

name = 'wechatFish'

key_word=settings.SUBJECT_KEY_WORDS

allowed_domains = ['mp.weixin.qq.com','weixin.sogou.com','mmbiz.qpic.cn']

start_urls = ['http://weixin.sogou.com/weixin?type=2&query=%s&ie=utf8' %key_word]

def parse(self, response):

print("\n")

print("***********parse spider***************")

wechat_item = WechatfishmanItem()

driver = webdriver.PhantomJS()

driver.get(response.url)

#time sleep is very import to load the url

time.sleep(30)

soup = bs4(driver.page_source,'html.parser')

news_list=soup.find_all('ul', {'class':'news-list'})

for news_item in news_list:

txt_box_list = news_item.find_all('div', {'class':'txt-box'})

for txt_box in txt_box_list:

news_href=txt_box.find('a')

wechat_item["file_name"] = news_href.get_text().strip()

print("******************\n")

print("title :%s" % wechat_item["file_name"])

wechat_item["file_url"] = news_href.get("href")

print("href :%s" % wechat_item["file_name"])

yield wechat_item

#for prevision page

next_page=soup.find('a',{"id":'sogou_next'})

if next_page:

if len(next_page) == 0:

print("\n-------->Finished the spider")

return

next_page_link = next_page.get("href")

if next_page_link:

#the last element

next_page_link = "http://weixin.sogou.com/weixin"+ next_page_link

yield scrapy.Request(next_page_link, callback=self.parse)

else:

print("\n-------->No More Page")

driver.quit()

WechatfishmanItem.py:爬取結果項定義類

import scrapy

class WechatfishmanItem(scrapy.Item):

# define the fields for your item here like:

file_name = scrapy.Field()

file_url = scrapy.Field()

settings.py 打開中間件以及配置相關的常量值

FILE_SAVE_DIR='/home/hxb/wechat'

SUBJECT_FILE_NAME='深度學習'

SUBJECT_KEY_WORDS='深度學習'

ITEM_PIPELINES = {

'wechatFishman.pipelines.WechatfishmanPipeline': 1,

}

爬取結果處理類:WechatfishmanPipeline

# -*- coding: utf-8 -*-

import wechatFishman.settings as settings

from openpyxl import Workbook

from openpyxl import load_workbook

import os

import datetime

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from scrapy.xlib.pydispatch import dispatcher

from scrapy import signals

class WechatfishmanPipeline(object):

row_index = 0

file_path =  settings.FILE_SAVE_DIR+"/"+settings.SUBJECT_FILE_NAME+ "-"+datetime.date.today().strftime('%Y%m%d')+".xlsx"

def __init__(self):

dispatcher.connect(self.spider_closed,signals.spider_closed)

def process_item(self, item, spider):

print("***********WeChatFish Pipeline**************\n")

print("---------->save:%s" %item['file_name'])

dir_path="/home/hxb/wechat"

self.save_xls(item['file_name'],item['file_url'])

return item

def spider_closed(self,spider):

print("\n--------------->closed spider")

self.send_mail(self.file_path)

def save_xls(self,name,url):

print("\n******>Save to File %s" %self.file_path)

if not os.path.exists(self.file_path):

wb = Workbook()

ws = wb.active

ws.append(["Title","URL Link"])

self.row_index = self.row_index+1

wb.save(self.file_path)

load_wb = load_workbook(self.file_path)

ws = load_wb.active

self.row_index = self.row_index+1

ws.cell(self.row_index,1).value = name

ws.cell(self.row_index,1).hyperlink = url

ws.cell(self.row_index,2).value = url

ws.cell(self.row_index,2).hyperlink = url

load_wb.save(self.file_path)

def send_mail(self,file):

mail_host = 'smtp.163.com'

msg = MIMEMultipart('related')

msg['Subject'] = 'WeChat Spider result from'

msg['From'] = 'aaa@163.com'

#to_list = ['xxx@xxx.com','aaa@bbb.com','ccc@sss.com']

to_list= ['xxx@aaa.com']

msg['To']=','.join(to_list)

msg_doc = MIMEText(open(file,'rb').read(),'base64','utf8')

msg_doc.add_header('content-disposition','attachment',filename=settings.SUBJECT_FILE_NAME+datetime.date.today().strftime('%Y%m%d')+".xlsx")

msg.attach(msg_doc)

smtp = smtplib.SMTP(mail_host,25)

smtp.login('aaa@163.com','vicent$1981')

smtp.sendmail('aaa@163.com','aaa@ccc.com',msg.as_string())

smtp.quit()

運行爬蟲獲取內容

使用scrapy命令運行創建的爬蟲:

scrapy crawl wchatFish

查看爬蟲結果

在我們設定的目錄可以看到生成的爬蟲文件

在郵箱中我們也可以到爬蟲發送過來的excel結果文件

注意事項

爬取時需要間隔一定的時間,否則會觸發搜狗的發爬蟲措施導致無法爬取信息

相關文章

  1. 如何抓取微信公眾號文章呢?

    前段時間,騰訊微信前段時間實現了反爬蟲計劃,使得很多方法都使用不了.現在,如果高效率地在微信公眾號哪裡抓取文章的話,單單靠搜狗這個搜尋入口是不行的了. 工具/原料 php.mysql php爬蟲程序 ...
  2. Wordpress如何批量抓取微信公眾號和頭條號?

    微信公眾號和頭條號上有很多好文章使得很多站長垂涎,如果有好方法可以批量將其抓取下來就好了,可以節約巨量的轉載時間.那麼,今天就分享一個Wordpress專用的採集插件:QQWorld收藏家 工具/原料 ...
  3. 如何在微信公眾號發布文章?

    如何利用微信公眾號號發布文章? 方法/步驟 登錄微信公眾號號. 點"素材管理". 單擊"新建圖文素材". 輸入標題.作者和內容. 可根據需要插入不同項目. 以圖 ...
  4. 如何搜尋指定微信公眾號的文章

    微信,現在對於人們生活可以說是越來越重要了,大家不僅可以用微信和親朋好友聊天增進感情,還可以關注相關微信公眾號,了解知識,獲取實時資訊,但是有時候,我們看過一篇好的微信文章後忘記了收藏,以至於我們後來 ...
  5. 如何用微信公眾號群發文章

    如何用微信公眾號發文章,很多人已經知道了,但是有部分人還不太清楚,今天就給不清楚的小夥伴做下示範,當然,首先你要有個號 工具/原料 電腦 方法/步驟 進入微信公眾平台官網,然後登陸帳號進行登錄 點擊群 ...
  6. 如何給微信公眾號的文章標題加上表情符號

    如何給微信公眾號的文章標題加上表情符號?相信小夥伴們在看到別人公眾號推送文章的題目裡面出現表情或者表情符號的話,應該都會覺得這是不是付費效果,或者需要複雜的代碼,這裡就一切給大家簡單化,來看看如何給你 ...
  7. 微信公眾號的文章怎麼樣添加音樂?

    隨著微信使用者的增加,微信公眾號的傳播影響力也越來越大.很多微信公眾號經營者都會更新文章進行推廣.有時候,在文章中添加音樂,會使文章吸引力更強.那麼,如何在微信公眾號文章上面添加音樂呢? 工具/原料 ...
  8. 怎麼用微信公眾號發文章

    微信公眾號盛行,剛開始可以學會用微信公眾號簡單的發表一些文章 工具/原料 電腦一台 要有網啊 方法/步驟 公眾號登錄,當然前提條件是你必須成功註冊了微信公眾號 輸入帳號和密碼後,會出現二維碼提示,用微 ...
  9. 怎麼在微信公眾號發文章。

    微信公眾號是一個服務平台,可以通過它把內容分享給自己的用戶.在微信公眾號里,我們可以向用戶推送多種內容,比如語音,圖片,文字或文章等.這裡簡單介紹下怎麼在公眾號上發文章的操作方法. 工具/原料 微信公 ...
  10. 電腦上發布和查看微信公眾號的文章及快速吸粉

    作為一個公眾號運營者,有時候我們發布一些微信公眾號的文章時,閱讀的用戶很有限,僅僅是我們通過各種贈送活動主動吸來的粉絲,想讓龐大的網民看到我們的文章,成為我們的粉絲,卻又苦於沒有途徑.最近發現一個二碼 ...
  11. 如何在電腦端查閱任一微信公眾號的文章呢?

    我們都知道微信是是手機端玩的軟體,而有的微信公眾號裡面的圖文很不錯,但是不想整天對著手機看,這樣怎麼辦呢?如何能在電腦端看手機上面的微信文章呢? 工具/原料 微信.電腦.網際網路.瀏覽器 方法/步驟 在 ...
  12. 如何採集微信公眾號歷史文章導出Excel表格!

    微信文章採集器是一款可以採集微信公眾號歷史文章,導出excel,txt,json,html,mdb等格式. 工具/原料 電腦,網際網路 微信公眾號,公眾號 方法/步驟 首先選擇一個瀏覽器,百度搜尋關鍵詞 ...
  13. 如何給微信公眾號的文章添加原創聲明?

    現在很多企業.個人都開通了微信公眾號.微信公眾號分為服務號.訂閱號,大家利用微信公眾號進行品牌打造.宣傳推廣,信息的推送,也有用來做售後服務的.綜觀如今的微信公眾號運營的情況來看,對公眾號進行二次開發 ...
  14. 電腦上如何分享微信公眾號的文章?

    在手機上,只有關注了微信公眾號,才會收到它推送的信息:但是,你可以通過朋友圈和微信的搜尋看到一些微信公眾號的文章,只有關注了對應的微信公眾號才能看到發布的文章以及相關的信息.在個人微信中,看到文章可以 ...
  15. 如何使用微信公眾號發布文章

    微信已經是繼QQ之後最大的一個社交平台,擁有非常大的流量資源.開通一個微信公號對一個企業或一個品牌來講非常重要. 工具/原料 微信公眾號 電腦 方法/步驟 先百度搜尋,進入微信公眾號登錄埠 登錄後, ...
  16. 如何搜尋微信公眾號、文章

    微信公眾號越來越多,有些公眾號發布的文章還是挺有價值的,如何在找到自己需要的內容呢,請往下看. 工具/原料 搜狗搜尋引擎 方法/步驟 百度搜尋"sougou"找到搜狗搜尋的官網.( ...
  17. 微信公眾號群發文章怎麼添加小程序?

    2017年4月20日微信發布公告稱,微信公眾平號群發文章支持添加小程序功能,這對於推廣小程序來說,無疑是不錯的途徑.那麼微信公眾號群發文章怎麼添加小程序?以下是詳細教程. 微信公眾號群發文章怎麼添加小 ...
  18. 微信公眾號運營文章的封面圖片選擇和修改技巧

    在微信公眾號的運營中,編寫文章是其主要手段,本文主要針對在編寫微信文章時候需要必須用到的封面圖片方面談談自己的工作經驗和技巧. 工具/原料 電腦一台 photoshop軟體 一.封面圖片的尺寸 首先, ...
  19. 如何讓微信公眾號推文預覽連結長期有效?

    近期微信公眾平台對公眾號素材庫文章進行更新,此次升級後,編輯微信公眾號文章發送出的預覽模式開始增加有效期限.打開預覽模式可以看到相關提示:預覽連結將在500次預覽或12小時後失效,這意味著以後預覽模式 ...
  20. 怎麼將微信公眾號群發文章製作好看些

    在微信公眾平台素材管理製作出來的文章不怎麼吸引人,過於單調無法將吸引人信息宣傳得更好.下面教大家 工具/原料 微信公眾平台號 秀米微信編輯器 方法/步驟 在百度搜尋中輸入"秀米", ...