模塊安裝
這裏涉及到的模塊,沒有安裝的可以自己安裝
pip install xxx
MangoDB環境配置
https://blog.csdn.net/jia666666/article/details/82191990
python爬蟲之ProxyPool(代理ip地址池的構建)
實現目的
通過搜狗搜素相關關鍵詞的微信文章,通過解析,提取相關信息,保存到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地址
寫入數據庫後,打開查看如圖,裏面記錄爬取的所有信息
右鍵可以選擇瀏覽文件