美文网首页程序员
30分钟!用python的request模块抓取百度贴吧内容

30分钟!用python的request模块抓取百度贴吧内容

作者: 金哥数据分析 | 来源:发表于2018-07-26 15:18 被阅读124次
    python爬虫

    001

    我想通过自动抓取百度贴吧 “python爬虫吧“ 里的帖子数据,找到那些付费写爬虫的帖子,赚点零花钱!为了尝试新鲜的技术,我用到了python里的request模块,因为这个模块把http请求编写简化了。而具体的html内容分析我还是用xpath技术。
    request手册
    xpath

    002

    分析下百度贴吧的url地址:“https://tieba.baidu.com/f?ie=utf-8&kw=python%E7%88%AC%E8%99%AB&fr=search”,其中中间的kw字段就是本次要爬区的贴吧名字 “python爬虫吧"。
    先用request.get方法来get这个贴吧首页的帖子列表,我们希望能抓取出所有的帖子标题,通过标题来判断用户是否有需求和付费的想法。

    import requests    
    page=1 #第一页   
    data = {"id":"utf-8", "kw":"python爬虫", "pn":page}
    r = requests.get('https://tieba.baidu.com/f', params=data) #大家看到没,get可以把params参数传入
    print(r.text) 
    

    request.get 可以把get的参数通过数组传入!这段代码就获取了贴吧的首页,这里的page变量是为了将来获取其他分页的内容,预留的变量!

    003

    xpath不多讲了。接下来,重点就是分析首页html的结构,咱们打开chorme [开发者工具], 找到 帖子标题对应的css代码。然后用xpath方法获取这些帖子。看下面两个图,来理解这个过程:


    AB5A9754-6CE7-44EF-9199-D29956832FFA.png
    5934D6B4-9E8B-4799-AB2A-CE82A6946778.png
    import requests
    from lxml import etree
    
    page=1 #第一页
    data = {"id":"utf-8", "kw":"python爬虫", "pn":page}
    r = requests.get('https://tieba.baidu.com/f', params=data) #大家看到没,get可以把params参数传入
    # print(r.text)
    
    root = etree.HTML(r.text)
    result = root.xpath("//ul[@class='threadlist_bright j_threadlist_bright']/li") #找到列表
    print(len(result))
    for i in range(len(result)):
        title = (result[i].xpath(".//div[@class='threadlist_title pull_left j_th_tit ']/a/text()")) #找到标题
        print(title)
    

    请注意,最关键就是列表 + 帖子标题提取的两个xpath,这个需要对照chorme自己去调试才能写出来。初步成功,爬取标题的列表如下:

    48
    []
    ['新手求助关于asyncio库的问题']
    ['python 2.7环境下爬图,初学者请多指教']
    ['江湖救急,来个大佬,如何用python监控手机的推送通知,可py交易']
    ['爬取中国裁判书文网遇到问题,求大神指点迷津']
    ['源码分享,爬取甜美妹子图妹子,就怕你硬盘不够大']
    ['求问这个今日头条的网址为什么不能获取完整代码']
    ['Python爬虫该怎么学习?学习步骤是什么? Python爬虫该怎么学习']
    ['无偿写爬虫,将你们的需求留下来,我来写']
    ['爬取图片保存之后只有一张图是怎么回事啊']
    ['分享慕课网七月老师的Python3入门+进阶课程视频']
    ['如何入门 Python 爬虫?']
    ['scrapy 创建出现10060错误']
    ['那个大神指导这个错误是啥意思,我爬网站里所有的的图片,我一个']
    ['Python基础问题答疑帖']
    ['云计算与大数据路过,Python不会但是感兴趣有人带吗?']
    ['Python各种安装包,需要什么安装包可以在下方留言']
    ['有没有靠谱点的python微信学习交流群']
    ['跪求最新工商注册的新公司的数据源']
    ['scrapy框架使用默认的文件管道下载视频有问题']
    ['Python源码分享']
    ['那个网站的动态ip 比较好']
    ['Python小白学习笔记,有需要的看过来哦,大家一起交流一起']
    ['为什么我用scrapy爬豆瓣电影250只能爬到200条?']
    ['有接项目的吗?']
    ['哪个大神帮我想想办法。怎么把range里面的 url的结果全']
    ['爬了BOOS直聘和拉钩网的有关于python爬虫的岗位信息']
    ['请问Python有什么好的书可以推荐']
    ['这个怎么解决,导入json  一直是灰色的,代码也运行不了']
    ['想练习爬虫,有推荐爬虫项目的吗']
    ['求助根据地址百度API批量爬取经纬度']
    ['Python爬取新浪微博【技术贴】']
    ['武汉python爬虫招聘']
    ['Python爬虫相关问题答疑帖']
    ['【求助】python爬虫的时候xpath获取网页内容出问题']
    ['做python爬虫的老哥们,爬虫经常加班吗?']
    ['爬取游民星空出现了一个尴尬的问题']
    ['高级爬虫']
    ['有工作过的前辈能指教一下吗']
    ['我学习了网络爬虫相关的技术,自己也做过一些爬虫程序,请问有项']
    ['输入pip install pyopenssl 和pip i']
    ['〈td〉爬取问题']
    ['请教大佬们一个问题,爬虫可以实现抓取某个APP上所有的域名吗']
    ['有谁知道怎么获取抖音的as cp mas字段吗']
    ['启动不了qt5,怎么办,昨天还好好的呢']
    ['求大神帮解决,选项点不了,也运行不了']
    ['谁手上有爬贴吧里面帖子标题的码子,求一套热乎的']
    ['求帮助,cmd里看包应该是安装成功了可软件报错']
    

    效果不错哦!

    004

    最后,解决分页问题,其实上面已经讲过了,page就是预留的分页参数,这里会把爬首页的代码抽成一个函数,然后再按page提取,直接放出最终的代码:

    import requests
    from lxml import etree
    
    def tieba_req(page):
        data = {"id":"utf-8", "kw":"python爬虫", "pn":page}
        r = requests.get('https://tieba.baidu.com/f', params=data)
        # print(r.text)
        root = etree.HTML(r.text)
        result = root.xpath("//ul[@class='threadlist_bright j_threadlist_bright']/li")
    
        print(len(result))
        for i in range(len(result)):
            title = (result[i].xpath(".//div[@class='threadlist_title pull_left j_th_tit ']/a/text()"))
            print(title)
        
            content = (result[i].xpath(".//div[@class='threadlist_abs threadlist_abs_onlyline ']/text()"))
            if len(content) > 0:
                content = content[0]
            else:
                content = ""
            content = trim(content)
        #     print(content)
    
    for i in range(10): #来,给爷爬10页的
        tieba_req(i*50)
    
    def trim(str):
        if(str==''):
            return str
        elif (str[0]!=' ')and(str[-1]!=' '):
            return str
        elif str[0]==' ':
            return trim(str[1:])
        else :
            return trim(str[0:-1])
    

    微信公号


    API1024微信

    相关文章

      网友评论

        本文标题:30分钟!用python的request模块抓取百度贴吧内容

        本文链接:https://www.haomeiwen.com/subject/fnsvmftx.html