美文网首页
用python抓知乎数据

用python抓知乎数据

作者: 大邓和他的python | 来源:发表于2016-09-30 19:41 被阅读564次

    遇到这个坑爹了,因为你发现点击“更多”按钮后,网址部分没有变化,但页面却加载了新的数据。怎么办????

    没法按照之前的 有规律的网址&page=number ,通过for循环依次遍历网页。

    在这里我不讲抓包,分析请求包。咱们就用生硬的方法,破解这问题。在这里我使用了selenium库,并且要安装一个火狐浏览器(firefox36)。轻松破解该问题。

    selenium教程,建议大家网上买《selenium 2自动化测试实战-基于python语言》 这本书阅读相关知识。当然也可以根据本代码,在网上查相关selenium的知识。

    import re
    import csv
    import time
    import urllib.parse as parse
    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    # keyword话题名 ,filename保存数据的文件名,page_num收集多少页
    def topic_title_spider(keyword='王宝强', filename = 'wangbaoqiang', page_num = 10):
    
        start = time.time()
    
        # 建立一个收集数据的csv文件
        csvFile = open(r'E:\%s.csv'% filename, 'a+', newline='')
        writer = csv.writer(csvFile)
        writer.writerow(('title', 'review_num'))
    
        # 将关键词转换为十六进制格式,填入到链接中
        kw = parse.quote(keyword)
        driver = webdriver.Firefox()
        driver.get('https://www.zhihu.com/search?type=content&q=%s' % kw)
    
    # 正则表达式,用来匹配标题,评论数
        reg_title = re.compile(r'<a class="js-title-link" href=.*?" target="_blank">(.*?)</a>')
        reg_li = re.compile(r'item clearfix.*?')
        reg_num = re.compile(r'<a class="zm-item-vote-count hidden-expanded js-expand js-vote-count" data-bind-votecount="">(.*?)</a>')
    
    # 先循环点击页面底部“更多”,加载尽可能多的页面数据
        for i in range(1, page_num, 1):
            driver.find_element_by_link_text("更多").click()
            duration = time.time()-start
            print('%s小爬虫 已经跑到 第%d页 了,运行时间%.2f秒,好累啊'%(keyword, i, duration))
            time.sleep(5)
    
        soup = BeautifulSoup(driver.page_source, 'lxml')
        li_s = soup.find_all('li', {'class': reg_li})
    
        for li in li_s:
            li = str(li)
            try:
                title = re.findall(reg_title, li)[0]
                title = title.replace('<em>', '')
                title = title.replace('</em>', '')
                review_num = re.findall(reg_num, li)[0]
            except:
                continue
            writer.writerow((title, review_num))
            print(title, review_num)
    
        csvFile.close()
        driver.quit()
    
    topic_title_spider(keyword='王宝强', filename = 'wangbaoqiang', page_num = 5)
    

    该方法缺点是运行速度慢,用了三十多秒。不过对于小数据需求的小白们来说,还是可以接受的。

    欢迎关注公众号 大邓带你玩转python

    大邓带你玩转python
    每周有直播哦,扫码即可加入

    相关文章

      网友评论

          本文标题:用python抓知乎数据

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