環(huán)境:
python3 scrapy
目的
寫這篇文章主要是做一下紀(jì)念肄满,畢竟是搞了快兩天的東西了谴古,今天加大了量,使用scrapy爬取100多個(gè)微信公眾號稠歉,然后出現(xiàn)IP被封的情況下掰担,當(dāng)然了,這種情況并不是沒有辦法解決怒炸,只需要在scrapy中進(jìn)行設(shè)置一下就可以了带饱,主要是在本地進(jìn)行調(diào)試,然后IP代理池那一塊暫時(shí)找不到好的質(zhì)量高的IP横媚,只是爬取了各大網(wǎng)站的免費(fèi)IP纠炮,并沒有很好的解決效果月趟,這個(gè)版本只要在IP中稍微進(jìn)行下設(shè)置調(diào)整灯蝴,可以不愧為一個(gè)很好的爬取微信公眾號歷史消息的一個(gè)小案例。
爬取步驟
-
找到公眾號
-
獲取歷史消息
-
獲取詳情頁內(nèi)容
還有第4步:
將詳情頁內(nèi)容解析出來孝宗,圖片穷躁,文字都單獨(dú)拎出來,現(xiàn)在暫時(shí)不做處理,因?yàn)檫@一塊有些麻煩的问潭。邏輯整體就是這樣猿诸。
python代碼
這里是spider的代碼,其他的就不用貼出來了:
spiders/WeChatSogou.py
# -*- coding: utf-8 -*-
# @Time : 2018/2/25 14:24
# @Author : 蛇崽
# @Email : 643435675@QQ.com
# @File : WeChatSogou.py(微信公眾號爬蟲:不包含瀏覽量跟評論)
import scrapy
import re
import time
import json
import requests
from fake_useragent import UserAgent
from scrapy import Request
from scrapy_redis.spiders import RedisSpider
from News_scrapy.items import NewsItem
from News_scrapy.constants.WeChatSource import WXSource
class WeChatSogouSpider(scrapy.Spider):
name = "WeChat"
allowed_domains = ["weixin.sogou.com",'mp.weixin.qq.com']
start_urls = ['http://weixin.sogou.com/']
def parse(self, response):
wx_source = WXSource.get_dict()
for v_wx_source in wx_source:
print('wx_source ===',v_wx_source)
try:
type = v_wx_source.split('-')[0]
channel = v_wx_source.split('-')[1]
print("正在抓取:", type, channel)
v_main_url = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query={}'.format(channel)
print('v_main_url',v_main_url)
yield scrapy.Request(url=str(v_main_url),callback=self.parse_main_link,meta={'type':type})
except:
continue
print('wx_source error ===', v_wx_source)
def parse_main_link(self,response):
print('parse_main_link ==== ',response.body)
target_url = response.xpath("http://*['txt-box']/p[@class='tit']/a/@href").extract_first()
print('===== start =====')
print('target_url',target_url)
print('==== end =====')
if target_url:
yield scrapy.Request(url=target_url,callback=self.parse_list_gzhao)
def parse_list_gzhao(self,response):
print('resonse: ',response)
req_text = response.text
reg_content_url = r'"content_url":"(.*?)",'
m_infos = re.findall(reg_content_url, req_text, re.S)
print(len(m_infos))
for v_info in m_infos:
v_info = 'https://mp.weixin.qq.com' + re.sub('&', '&', v_info)
print(v_info)
yield scrapy.Request(url=v_info,callback=self.parse_detail)
def parse_detail(self, response):
print('parse_detail ===== ',response.text)
注意事項(xiàng):
1 allowed_domains = ["weixin.sogou.com",'mp.weixin.qq.com']
2 reg_content_url = r'"content_url":"(.*?)",'
這里通過正則方式獲取每個(gè)詳情頁鏈接的url狡忙,因?yàn)樵挠玫膉s動(dòng)態(tài)加載的梳虽,
下面這是注意事項(xiàng)2的截圖:
很蛋疼吧,哈哈灾茁,哎窜觉。
放上自己小小的學(xué)習(xí)交流群吧
Python自學(xué)交流群(702689263)