Python爬虫入门(二):使用requests和xpath爬取论坛发帖列表

3,276 阅读3分钟

在上篇文章中使用 beautifulsoup 解析网页结构,虽然也能实现需求,但是效率不高,更好的方法是使用 Xpath 解析,后者具有更清晰地层次和更好的性能,不过需要额外安装一个 lxml 库。 下面就用 lxml 改造一下上一篇文章。

安装lxml

pip install lxml

代码

import requests
from bs4 import BeautifulSoup as bs
import time
import lxml


url = "https://bbs.hupu.com/bxj-postdate"
useragent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
header = {
    'user-agent': useragent,
    # 虎扑从第11页开始就必须登录才能查看
    # 从浏览器端登录后直接复制cookie,会过时,以后运行还得重新复制一遍。
    'cookie': 'your cookie'
}

for page in range(0,50):
    page_url = url + '-' + str(page+1)
    print(f'------------------ 第{page+1}页内容 {page_url}-------------------')
    response = requests.get(page_url, headers=header)
    last = time.time()
    selector = lxml.etree.HTML(response.text)
    ul_li = selector.xpath('//*[@id="ajaxtable"]/div[1]/ul/li')
    for li in ul_li:
        item = {}
        # 标题
        title_box = li.xpath('./div[@class="titlelink box"]')[0]
        item['link'] = hupu_domin + title_box.xpath('./a[@class="truetit"]/@href[1]')[0]
        # 测试发现有些标题会用<b>标签包裹(具体见下一个单元格),需要特殊处理
        if title_box.xpath('./a[@class="truetit"]/text()'):
            item['text'] = title_box.xpath('./a[@class="truetit"]/text()')[0]
        else:
            item['text'] = '【加重】:' + title_box.xpath('./a[@class="truetit"]/b/text()')[0]
        # 作者
        autoor_box = li.xpath('./div[@class="author box"]')[0]
        item['author'] = autoor_box.xpath('./a[@class="aulink"]/text()')[0]
        # 发帖时间
        item['date'] = autoor_box.xpath('./a[2]/text()')[0]
        print(item)
        
    now = time.time()
    print(f'耗时{now-last}')
    time.sleep(1)

结果展示

------------------ 第1页内容 https://bbs.hupu.com/bxj-postdate-1-------------------
117
{'link': 'https://bbs.hupu.com/36406828.html', 'text': '高考数学毁在了硬件上', 'author': '天魔王织田信长', 'date': '2020-07-07'}
{'link': 'https://bbs.hupu.com/36406825.html', 'text': '理性讨论,周王陶林和罗大佑,李宗盛,朴树,汪峰哪组创作能力更强', 'author': '上单国服凯', 'date': '2020-07-07'}
{'link': 'https://bbs.hupu.com/36406824.html', 'text': '数学全国二我傻了', 'author': '我只喜欢万茜', 'date': '2020-07-07'}
{'link': 'https://bbs.hupu.com/36406822.html', 'text': '晚上要去面试古茗的兼职,大伙有什么想要提醒一下的吗?', 'author': '重理工安东尼', 'date': '2020-07-07'}
...
{'link': 'https://bbs.hupu.com/36404667.html', 'text': '2020年高考十大热搜专业zt', 'author': '小_熊', 'date': '2020-07-07'}
{'link': 'https://bbs.hupu.com/36404666.html', 'text': '男生怎么看女生有纹身?', 'author': '三毛和Echo', 'date': '2020-07-07'}
耗时0.09512805938720703
...
...
...
------------------ 第50页内容 https://bbs.hupu.com/bxj-postdate-50-------------------
101
{'link': 'https://bbs.hupu.com/36390301.html', 'text': '明天高考了,jrs留下一句对高三学子的祝福吧!', 'author': '超Carry的淳希', 'date': '2020-07-06'}
{'link': 'https://bbs.hupu.com/36390297.html', 'text': 'a股日涨6%居然没人讨论?', 'author': 'mcskyward', 'date': '2020-07-06'}
{'link': 'https://bbs.hupu.com/36390296.html', 'text': '烧饼应该是郭德纲追着给饭吃', 'author': '千禧基地', 'date': '2020-07-06'}
{'link': 'https://bbs.hupu.com/36390290.html', 'text': '话说中信银行校招的底薪一般啊,中信不是银行中收入高的那一批吗', 'author': 'nene我内人', 'date': '2020-07-06'}
{'link': 'https://bbs.hupu.com/36390287.html', 'text': '高铁上居然发现两个男的在干这种事?', 'author': '超级打架王', 'date': '2020-07-06'}
...
...
...
{'link': 'https://bbs.hupu.com/36389948.html', 'text': '兄弟萌求一张97版慕容复演员的动图', 'author': '圗弼', 'date': '2020-07-06'}
{'link': 'https://bbs.hupu.com/36389943.html', 'text': '兄弟们,明天高考了今天买考试用品花了66.6什么水平', 'author': '高中毕业就退休', 'date': '2020-07-06'}
耗时0.0585782527923584

总结:使用xpath的的解析耗时缩短了一倍。

参考