抓取微信文章2000篇和无限抓取百度词条(标题和简介)

前几天用selenium抓取了搜狗微信文章666篇,今天想用抓包工具fiddler进行抓包,同样实现抓取微信文章

还有就是,用一个递归调用无限抓取百度百科的词条简介,很简单的一个实现

知识储备:fiddler的基本使用(如何断点),一些常用python模块的使用,redis模块的使用,对深度遍历有一点点的理解。

首先是,抓取微信文章,很简单的实现。每一步的说明都在代码里,可以看的懂。

# coding : utf-8

from time import sleep
from threading import Thread
from bs4 import BeautifulSoup
import requests,pymongo

Client = pymongo.MongoClient()
da = Client.pythonSpider
db = da.weixinarticle_3v
# 在MongoDB里面建立一个数据集,用来存储数据

def request_func(url):
    # 一个请求函数,用来确保请求的有效性
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}
    html = requests.get(url,headers=headers)
    html.encoding = 'utf-8'
    # 将网页的编码,变为‘utf-8’
    if html.status_code == 200:
        return html.text
    else:
        return None

# 下面是两个构造url的函数,因为我们爬取的url有两种类型
# 一种是大标题下的一个页面
# 一种是加载更多时的url

def struct_big_url():
    for big in range(0,21):
        big_page = 'http://weixin.sogou.com/pcindex/pc/pc_{0}/pc_{0}.html'.format(big)
        yield big_page
        # 将函数做成一个url生成器

def struct_sub_url():
    for big in range(0,21):
        for sub in range(1,5):
            sub_page = 'http://weixin.sogou.com/pcindex/pc/pc_{0}/{1}.html'.format(big,sub)
            yield sub_page

# 解析页面的函数,提取一个页面的标题和文章的链接
def parser_pages(html):
    Soup = BeautifulSoup(html,'lxml')
    # 因为在两种url(上述)有两种页面结构,所以用错误捕捉的方式,考虑两种情况的解析
    try:
        news_list = Soup.find('ul',class_="news-list").find_all('li')
    except Exception:
        news_list = Soup.find('body').find_all('li')
    for i in news_list:
        try:
            h3 = i.find('h3').find('a')
            # 找到含有标题和文章链接的标签
            article_url = h3.get('href')
            article_title = h3.get_text().strip()
            article_content = parser_one_page(article_url)
            # parser_one_page函数用来提取一篇文章的内容,参数是这篇文章的url
            db.insert_one({article_title:article_content})
            # 插入数据库
        except Exception:
            pass

# 对一篇文章的解析,用于提取文章内容
def parser_one_page(url):
    html = request_func(url)
    Soup = BeautifulSoup(html,'lxml')

    main_content = Soup.find('div',id='img-content')
    h2 = main_content.find('h2').get_text()
    all_ps = main_content.find_all('p')
    entire_list = []
    entire_list.append(h2)
    for p in all_ps:
        one_p = p.get_text()
        entire_list.append(one_p)

    entire_article = '\n'.join(entire_list)
    # 连接文章内容
    return entire_article

def get_big_page():

    for i in struct_big_url():
        html = request_func(i)
        parser_pages(html)
        sleep(1)

def get_sub_page():

    for x in struct_sub_url():
        html = request_func(x)
        parser_pages(html)
        sleep(1)

def main():
    '''
    用main函数开启了一个多进程
    并有sleep方法控制爬取的速度
    :return:
    '''

    threads = []
    t1 = Thread(target=get_big_page,args=())
    t2 = Thread(target=get_sub_page,args=())
    threads.append(t1)
    threads.append(t2)

    for t in threads:
        t.start()
    for t in threads:
        t.join()

if __name__ == '__main__':
    main()

下面是无限抓取百度词条简介的代码,用心看也是可以看懂的啦!

# coding : utf-8

from bs4 import BeautifulSoup
import requests,redis

pool = redis.ConnectionPool(host='localhost',port=6379)
r = redis.Redis(connection_pool=pool)

# 请求函数
def request_func(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}
    html = requests.get(url,headers=headers,verify=False)
    if html.status_code == 200:
        html.encoding = 'utf-8'
        return html.text
    return None

n = 0

def parser_page(url):
    '''
    这是一个递归函数,用于调用,这个函数是整个程序的核心
    :param url: 
    :return: 
    '''
    global n
    n += 1
    r.hsetnx('baiduurl',value=n,key=url)
    '''
     建立这个数据集用于检验和防止重复抓取同一个链接,从而陷入死循环
     与下面的not r.hexists('baiduurl',url_new)联合使用,防止重复抓取
    '''
    html = request_func(url)
    Soup = BeautifulSoup(html,'lxml')
    main_content = Soup.find('div',class_='main-content')
    title = main_content.find('h1').get_text()
    content = main_content.find('div',class_="lemma-summary").get_text()
    r.hsetnx('baiducontent',key=title,value=content)
    all_as = main_content.find('div',class_="lemma-summary").find_all('a')
    for a in all_as:
        try:
            url_new = 'https://baike.baidu.com' + a.get('href')
            url_name = a.get_text()
            if not r.hexists('baiduurl',url_new) and not r.hexists('baiducontent',url_name):
                # 上面的语句就是防止陷入死循环的判断句
                '''
                只有新获得的链接没有存在于前面存放爬取过了的链接的数据集中
                且新连接的关键词也米有存在于存放content的数据集中时
                才会对此链接进行抓取
                '''
                parser_page(url_new)
                # 这个循环利用的是深度遍历
        except Exception:
            pass


if __name__ == '__main__':
    parser_page('https://baike.baidu.com/item/%E8%9A%8A%E5%AD%90/284876')
    # 随便以一个词条的链接作为爬取的起始点
百度百科约500万条词条,可用于语义关联或简单的知识网络建立,xml格式,解压后638M,请不要用记事本直接打开,我是用UE打开的,sublime好像会有乱码,文件内容示例如下: =1 <TITLE>=百度百科 =百度百度百科,网络,百科全书,百科词典 =百度知道;贴吧;百度空间;百度地图;百度新闻搜索;百度图片;百度mp3;百度Hi;百度工具栏;百度影视;百度邮编搜索;百度黄页搜索;百度杀毒;百度语音搜索;科利尔百科全书;苏联大百科全书;汇吃百科;维基百科;百度视频;百度蜘蛛;百度文库;互动百科;百度文档;百度文化共享搜索;百度盲道;百度会员;百度搜藏;百度TV;百科全书;知识掌门人;百度游戏;百度有啊;张震;科友; =http://baike.baidu.com/view/1.htm =2 <TITLE>=词条 =百度百度百科 =相关词条; =http://baike.baidu.com/view/2.htm =3 <TITLE>=编辑实验 =百度百度百科,帮助,词条,编辑 =词条;百度; =http://baike.baidu.com/view/3.htm =4 <TITLE>=馒头 =食品,饮食,面食,食谱,蒸馍 =大饼;油条;面包;饺子;花卷;包子;麻花;食品;主食;糯米饭;蛋糕;鲜肉包;米粥;面条;凉拌菜;年糕;饼干;窝头;粽子;烤饼;酥饼;汤圆;烧饼; =http://baike.baidu.com/view/4.htm =6 <TITLE>=雁荡山 =地理,旅游,旅游景点,自然景观,地质公园 =华山;泰山;普陀山;恒山;嵩山;莫干山;浣江;衡山;括苍山;双龙洞;雪窦山;天台山;天目山;楠溪江;天柱山;景宁香炉山;乌镇;杭州西湖;泽雅;白水洋;武夷山;洞宫山;桃花岛;三清山;黄山;新安江水库;崂山区;溪口;太姥山;南麂列岛;野鹤湫;庐山;江心屿;瑶溪;朱家尖;石桅岩;绍兴县;杨家溪;仙岩山;仙都风景区;大龙湫;三折瀑;五岳; =http://baike.baidu.com/view/6.htm =7 <TITLE>=灵峰 =风景,雁荡山,地理,旅游,温州 = =http://baike.baidu.com/view/7.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值