python爬蟲之微信文章抓取

模塊安裝

這裏涉及到的模塊,沒有安裝的可以自己安裝

pip install xxx

MangoDB環境配置

https://blog.csdn.net/jia666666/article/details/82191990

python爬蟲之ProxyPool(代理ip地址池的構建)

https://blog.csdn.net/jia666666/article/details/82226045

實現目的

通過搜狗搜素相關關鍵詞的微信文章,通過解析,提取相關信息,保存到mongdb數據庫中,
關鍵詞可以進行修改,獲取目標內容

源碼

import requests
from urllib.parse import urlencode
from requests.exceptions import ConnectionError
from pyquery import PyQuery as pq
import pymongo

client=pymongo.MongoClient('localhost')
db=client['weixin']
#url請求地址
base_utl='http://weixin.sogou.com/weixin?'
#搜索關鍵詞
keyword='風景'
#最大請求失敗次數
max_count=5
#代理是否啓用
proxy=None
#獲取代理的本地端口
proxy_pool_url='http://localhost:5555/random'
#代理獲取
def get_proxy():
    try:
        #網頁請求
        response=requests.get(proxy_pool_url)
        #請求成功,返回數據
        if response.status_code==200:
            return response.text
        return None
    except ConnectionError:
        return None

#網頁獲取
def get_html(url,count=1):
    #正在爬取的網頁,次數
    print('Crawling',url)
    print('craw time',count)
    global proxy
    #最大失敗數判斷
    if count>=max_count:
        print('tried too many counts')
        return None
    try:
        #代理判斷是否爲真
        if proxy:
            #代理地址拼接
            proxyies={
                'http':'http://'+proxy
            }
            #代理網頁請求
            response = requests.get(url, allow_redirects=False,proxies=proxyies)
        else:
            #本機ip地址請求,不允許自動跳轉鏈接
            response=requests.get(url,allow_redirects=False)
        #網頁狀態碼判斷是否成功獲取
        if response.status_code==200:
            #返回數據
            return response.text
        if response.status_code==302:
            #啓用代理
            proxy=True
            #獲取代ip:port
            proxy=get_proxy()
            #使用代理,重新執行
            if proxy:
                print('USing Proxy',proxy)
                return get_html(url)
            else:
                #代理獲取失敗
                print('get proxy failed')
                return None

    except ConnectionError as e :
        #輸入錯誤信息
        print('Error Occurred',e.args)
        #失敗次數加一
        count+=1
        #代理ip地址獲取
        proxy=get_proxy()
        #重新執行
        return get_html(url)



def get_index(keyword,page):
    #請求的數據
    data={
    'query':keyword,
    'type':2,
    'page':page
    }
    #url編碼
    queries=urlencode(data)
    #url拼接
    url=base_utl+queries
    #函數調用
    html = get_html(url)
    #返回網頁
    return html

def parse_index(html):
    #網頁解析
    doc=pq(html)
    #信息提取
    items=doc('.news-box .news-list li .txt-box h3 a').items()
    #返回文章鏈接
    for item in items:
        yield item.attr('href')
#獲取文章鏈接的內容
def get_detail(url):
    try:
        response=requests.get(url)
        if response.status_code==200:
            return response.text
        return None
    except ConnectionError:
        return None

#文章內容的信息解析提取
def parse_detail(html):
    doc=pq(html)
    title=doc('.rich_media_title').text()
    content=doc('.rich_media_content ').text()
    date=doc('#publish_time').text()
    nickname=doc('#js_name').text()
    name=doc('#js_profile_qrcode > div > p:nth-child(3) > span').text()
    return {
        'title':title,
        'date':date,
        'nickname':nickname,
        'name':name,
        'content': content
    }
#保存到mongodb數據庫
def save_to_mongo(data):
    if db['articles'].insert(data):
        print('save to mongo',data['title'])
    else:
        print('save to mongo failed',data['title'])

def main():
    #獲取10頁
    for page in range(1,10):
        html=get_index(keyword,page)
        if html:
            article_urls=parse_index(html)
            for article_url in article_urls:
                article_html=get_detail(article_url)
                if article_html:
                    article_data=parse_detail(article_html)
                    print(article_data)
                    save_to_mongo(article_data)
if __name__ == '__main__':
    main()

這裏只是採集前10頁的內容,所有內容的採集需要微信登錄纔可以,一共會有100頁,搜狗具有反爬蟲處理,當一個ip過於頻繁的訪問會出現301或302錯誤,這是搜狗反爬蟲檢測到異常,我們這裏只是10頁,效果還不太明顯,幾十頁的訪問時就會出現錯誤,這裏啓動了ip地址代理服務,會替換被封禁的ip繼續進行訪問,直至目標信息訪問完成,代理會提供一個api接口,使程序用來得到ip地址

寫入數據庫後,打開查看如圖,裏面記錄爬取的所有信息
這裏寫圖片描述
右鍵可以選擇瀏覽文件
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章