您的位置:首页 > 编程语言 > Python开发

python爬虫之微信文章抓取

2018-09-03 16:36 381 查看
版权声明:如有使用转载,请附加出处 https://blog.csdn.net/jia666666/article/details/82350761

模块安装

这里涉及到的模块,没有安装的可以自己安装

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地址

写入数据库后,打开查看如图,里面记录爬取的所有信息

右键可以选择浏览文件

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: