xpath解析爬虫爬取豆瓣图书Top250的数据

 这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据

第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩。

1.首先需要明确自己想要爬取的内容,并在网页中查看数据是否真实存在,右键检查网页源码即可。

2.确定好目标后,点击一下下一页,对比两页的url,看能否找到规律。将有变化的地方用花括号表示 --->https://book.douban.com/top250?start={}

3.开始编写代码,首先导入需要用到的包。这里我用到了requests模块;在lxml里导入了etree模块,因为要用到xpath解析(如果用正则解析则需要导入re模块);用到随机的UA所以在fake_useragent中导入了UserAgent;导入黄金组合timerandom是为了控制访问频率,避免不必要的麻烦。

目录

 这是在学习阶段写的爬虫,爬取的是豆瓣图书Top250榜的名称,作者,评分等数据

第一次写文章,如果有什么问题,欢迎各位大佬进行指正,谢谢来踩。

 


4.根据我的个人习惯,我会先把需要爬取得内容的xpath放在代码中注释,这样用的时候就能快速得到。 在Chrome浏览器中,找到需要的位置右键copy xpath即可,也可以自己手写。

5.创建一个类,定义__init__函数将处理后的url放在__init__函数中方便调用。

class DoubanSpider:
    def __init__(self):
        self.url = 'https://book.douban.com/top250?start={}'

6.定义获取页面数据的函数。我将请求头放在了这个函数中,大部分网页都会有基于请求头的反扒,随机的UA可以解决一部分,在出现问题可能是网页检查cookie,打开网页复制一下cookie放入请求头即可,要以字典键值对的形式。最后调用解析函数,如果思路清晰可先写下然后alt+shift+回车即可自动创建,也是一个偷懒的小技巧=.=。

 def get_html(self,url):
        headers = {
            "User-Agent":UserAgent().random
        }
        html = requests.get(url=url,headers=headers).content.decode('utf-8','ignore')
        self.parse_html(html)

7.定义解析函数,将获取到的页面数据进行解析,因为在页面中这些数据在一个table下,所以做个列表将所有数据先解析出来,然后遍历列表再匹配自己想要的数据。这里我定义了一个字典来接收数据,因为有些数据可能会有缺失,所以用None来填补防止报错。然后打印内容,根据数据的形式对数据进行切片整理,做到稍微美观一些。

if xx_list else None

8.定义一个run函数,将需要传参的地方填补一下,因为共250本书,每一页是25本,所以共十页,将url拼接完整后传给get_html函数,在调用解析函数进行解析,参数搞定。设置一下访问频率,我采用了随机数,防止网页对我有意见。

def run(self):
        for page in range(10):
            page_url = self.url.format(page*25)
            self.get_html(url=page_url)
            time.sleep(random.uniform(2,5))

9.在尾部不要有缩进,打出main就会自动补全,创建一个引擎,运行整个爬虫文件。

 

 这是全部源码,网页内容可能变更,所以当您阅读时是否还能用就需要尝试一下了

import requests
from lxml import etree
from fake_useragent import UserAgent
import time
import random

#xpath解析
# title = '//table//a/@title'
# info = '//table//p[@class="pl"]'
# socre = '//table//div/span[@class="rating_nums"]/text()'
# commit = '//table//div/span[@class="pl"]/text()'
# comment = '//table//p/span/text()'


class DoubanSpider:
    def __init__(self):
        self.url = 'https://book.douban.com/top250?start={}'

    def get_html(self,url):
        headers = {
            "User-Agent":UserAgent().random
        }
        html = requests.get(url=url,headers=headers).content.decode('utf-8','ignore')
        self.parse_html(html)

    def parse_html(self, html):
        
        p = etree.HTML(html)
        tab_list = p.xpath("//table")
        for tab in tab_list:
            item = {}
            name_list = tab.xpath('.//a/@title')
            item['title'] = name_list[0].strip() if name_list else None
            info_list = tab.xpath('.//p[@class="pl"]/text()')
            item['info'] = info_list[0].strip() if info_list else None
            score_list = tab.xpath('.//div/span[@class="rating_nums"]/text()')
            item['score'] = score_list[0].strip() if score_list else None
            commit_list = tab.xpath('.//div/span[@class="pl"]/text()')
            item['commit'] = commit_list[0].strip()[1:-1].strip() if commit_list else None
            comment_list = tab.xpath('.//p/span/text()')
            item['comment'] = comment_list[0].strip() if comment_list else None
            print(item)
# url = 'https://book.douban.com/top250?start={}'
# headers = {
#     'User-Agent':UserAgent().random
# }
    def run(self):
        for page in range(10):
            page_url = self.url.format(page*25)
            self.get_html(url=page_url)
            time.sleep(random.uniform(2,5))

if __name__ == '__main__':
    B = DoubanSpider()
    B.run()

 

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值