python爬取微信文章

本文介绍了一种使用Python爬取微信公众号文章的方法。通过构造请求并解析返回的HTML内容,可以获取到文章链接并进一步抓取文章的具体内容,如标题、正文、发布日期等,并将这些数据保存至MongoDB中。
from urllib.parse import urlencode
from requests.exceptions import ConnectionError
from pyquery import PyQuery as pq
import pymongo
from config import *

client = pymongo.MongoClient(MONGO_URL)
db = client['weixin']

import requests

base_url = 'http://weixin.sogou.com/weixin?'

keyword = '风景'
proxy_pool_url = 'http://127.0.0.1:5000/get'

proxy = None
max_count = 5

headers = {
    'Cookie': 'ABTEST=0|1526734752|v1; SNUID=DB527D422B2940A28EB384222CAEB7F0; IPLOC=CN3505; SUID=F779516E721A910A000000005B001FA0; SUID=F779516E2513910A000000005B001FA0; weixinIndexVisited=1; SUV=005E51ED6E5179F75B001FA1C247B628; ppinf=5|1526734779|1527944379|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZTo1OlNtYXJ0fGNydDoxMDoxNTI2NzM0Nzc5fHJlZm5pY2s6NTpTbWFydHx1c2VyaWQ6NDQ6bzl0Mmx1R3F1QlQtWUhuNnUxLWxaLUl1WTZqOEB3ZWl4aW4uc29odS5jb218; pprdig=o6AdmRTOUUptZQw7iDlmIEuEHjPt_RboI7yG4c9_iIyCNyHNe-fgBehcKHdSsH-iWcmL1yySKckEhW-bzU8NXpOsz5QpJIkyYL7noWcEnTWlrYWlqJSW-coaEcZtQqWKMVogGewQOxatu1NKSv7r2T66SvaKezcelAmnVNqhTjs; sgid=13-35107991-AVsAH7sDP0MXQciayCKuuiaEE; ppmdig=1526734780000000dae1fe00f7f8221f5dcb1d034489fc95; sct=1; JSESSIONID=aaarQrSexCah38k9mmjnw',
    'Host': 'weixin.sogou.com',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}

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 save_to_mongo(data):
    if db['articles'].update({'title':data['title']},{'$set': data},True):
        print('Saved to Monoge',data['title'])
    else:
        print('Save Faile')


def get_html(url, count = 1):
    global proxy
    if count >= max_count:
        print('Tried Too Many...')
        return None
    try:
        if proxy:
            proxies = {
                'http': 'http://' + proxy
            }
            response = requests.get(url, allow_redirects=False, headers=headers, proxies=proxies)
        else:
            response = requests.get(url, allow_redirects=False, headers=headers)
        if response.status_code == 200:
            return response.text
        if response.status_code == 302:
            # Proxy
            print('302')
            proxy = get_proxy()
            if proxy:
                print('Using Proxy...',proxy)
                return get_html(url)
            else:
                print('Get Faile')
                return None
    except ConnectionError as e:
        print('Error',e.args)
        proxy = get_proxy()
        count += 1
        return get_html(url)


def get_index(keyword, page):
    data = {
        'query': keyword,
        'type': 2,
        'page': page
    }
    queries = urlencode(data)
    url = base_url + 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('#activity-name').text()
    content = doc('.rich_media_content ').text()
    date = doc('#publish_time').text()
    nickname = doc('.rich_media_meta_list .rich_media_meta_nickname').text()
    wechat = doc('#profileBt').text()
    return {
        'title':title,
        'content':content,
        'date': date,
        'nickname':nickname,
        'wechat':wechat
    }



def main():
    for page in range(1, 100):
        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)


if __name__ == '__main__':
    main()

Python爬取微信公众号的内容通常涉及到网络请求和HTML解析。由于微信官方对数据抓取有严格的限制,直接爬取可能会遇到反爬机制。以下是一个简化版的基本步骤: 1. **安装必要的库**: 首先需要安装`requests`用于发送HTTP请求,以及如`beautifulsoup4`或`lxml`等库用于解析HTML。 ```bash pip install requests beautifulsoup4 ``` 2. **获取网页内容**: 使用`requests.get()`函数获取公众号文章页面的HTML源码。例如,获取某个公众号的文章列表页URL: ```python url = 'https://mp.weixin.qq.com/s/your_article_url' response = requests.get(url) html_content = response.text ``` 3. **解析HTML**: 利用BeautifulSoup解析HTML文档,找到包含文章链接、标题或其他信息的部分。这通常涉及查找特定CSS或XPath选择器。 ```python soup = BeautifulSoup(html_content, 'lxml') articles = soup.find_all('a', class_='wx_media_qrcode') # 这里只是一个示例,实际的选择器可能不同 ``` 4. **处理数据**: 对每个找到的文章元素,提取出需要的信息(比如文章标题、链接),并将其存储到列表或字典中。 5. **保存数据**: 将收集到的数据按照需要的形式(如CSV文件、数据库或JSON)保存下来。 注意:微信对于爬虫的友好程度不高,频繁抓取可能会导致IP被封禁。因此,在实际操作中,你需要设置合理的延时(`time.sleep()`),遵守robots.txt规则,并尽可能模拟浏览器行为。另外,最好查阅微信开发者文档了解其API,如果可能的话,使用API进行合法抓取会更安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值