随笔 - 195  文章 - 3  评论 - 36  阅读 - 63万

爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

爬虫1:Requests+Xpath 爬取豆瓣电影TOP

【抓取】:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html

【分页】:参考前文 爬虫系列2:https://www.cnblogs.com/yizhiamumu/p/10267721.html

【保存】:参考前文 爬虫系列3:https://www.cnblogs.com/yizhiamumu/p/10270926.html

【动态】:参考前文 爬虫系列4:https://www.cnblogs.com/yizhiamumu/p/10272977.html

 

1 电影名称

复制代码
# 1 Requests+Xpath 菜鸟爬取豆瓣TOP 
# 电影名称

'''
Requests+Xpath 爬取豆瓣电影

安装 Python 应用包
pip install requests
pip install lxml

获取元素的Xpath信息并获得文本:

手动获取:定位目标元素,在网站上依次点击:右键 > 检查
file=s.xpath('元素的Xpath信息/text()') 

快捷键“shift+ctrl+c”,移动鼠标到对应的元素时即可看到对应网页代码:

在电影标题对应的代码上依次点击 右键 > Copy > Copy XPath,获取电影名称的Xpath:


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


film=s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/@title')
print(film)


# 打印:['追风筝的人']
复制代码

 

2 全部书名

复制代码
# 2 全部书名

'''
浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。


分别复制《追风筝的人》、《小王子》、《围城》、《解忧杂货店》的 xpath 信息进行对比:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a

比较可以发现书名的 xpath 信息仅仅 table 后的序号不一样,并且跟书的序号一致,于是去掉序号(去掉 tbody),我们可以得到通用的 xpath 信息:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


file=s.xpath('//*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title')

for title in file:
    print(title)



# 打印:
追风筝的人
解忧杂货店
小王子
白夜行
围城
挪威的森林
三体
嫌疑人X的献身
活着
红楼梦
百年孤独
不能承受的生命之轻
看见
达·芬奇密码
平凡的世界(全三部)
三体Ⅱ
三体Ⅲ
简爱(英文全本)
哈利·波特与魔法石
天才在左 疯子在右
送你一颗子弹
傲慢与偏见
我们仨
飘
倾城之恋
复制代码

 

3 爬取页面多个信息时的数据准确匹配问题

复制代码
# 3 爬取页面多个信息时的数据准确匹配问题

# strip(“(”) 表示删除括号, strip() 表示删除空白符。

'''

问题:我们默认书名和评分是正确的信息,如果某一项少爬或多爬了信息,匹配错误


思路:书名的标签肯定在这本书的框架内,以每本书为单位,分别取获取对应的信息,完全匹配

//*[@id=“content”]/div/div[1]/div/table[1]   #整本书
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a   #书名
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]   #评分

我们发现,书名和评分 xpath 的前半部分和整本书的 xpath 一致的, 那我们可以通过这样写 xpath 的方式来定位信息:

file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)
title =div.xpath(“./tr/td[2]/div[1]/a/@title”)
score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)

'''


import requests 
import time
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)

file=s.xpath('//*[@id="content"]/div/div[1]/div/table')

for div in file:
    title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
    href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
    score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
    num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")
    scribe = div.xpath("./tr/td[2]/p[2]/span/text()")
    
    time.sleep(2)
    
    print("{}{}{}{}{}".format(title,href,score,num,scribe[0]))


# 打印:

追风筝的人https://book.douban.com/subject/1770782/8.9327174人评价
                为你,千千万万遍
解忧杂货店https://book.douban.com/subject/25862578/8.6298863人评价
                一碗精心熬制的东野牌鸡汤,拒绝很难
小王子https://book.douban.com/subject/1084336/9.0252153人评价
                献给长成了大人的孩子们
复制代码

 

4 翻页

复制代码
# 4翻页
'''
https://book.douban.com/top250?start=0 #第一页
https://book.douban.com/top250?start=25 #第二页
https://book.douban.com/top250?start=50 #第三页

以每页25为单位,递增25,只是 start=()的数字不一样

写一个循环

for a in range(3):    
  url = 'https://book.douban.com/top250?start={}'.format(a*25)
  #3个页面,用 a*25 保证以25为单位递增
  
'''

import requests 
import time 
from lxml import etree


for a in range(3):
    url = 'https://book.douban.com/top250?start={}'.format(a*25)
    data = requests.get(url).text

    s=etree.HTML(data)
    file=s.xpath('//*[@id="content"]/div/div[1]/div/table')
    time.sleep(3)

    for div in file:
        title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
        href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
        score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
        num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()
        scrible=div.xpath("./tr/td[2]/p[2]/span/text()")

        if len(scrible) > 0:
            print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0]))
        else:
            print("{},{},{},{}\n".format(title,href,score,num))






# 打印:

追风筝的人,https://book.douban.com/subject/1770782/,8.9,327193人评价,为你,千千万万遍

解忧杂货店,https://book.douban.com/subject/25862578/,8.6,298891人评价,一碗精心熬制的东野牌鸡汤,拒绝很难

小王子,https://book.douban.com/subject/1084336/,9.0,252173人评价,献给长成了大人的孩子们
复制代码

 

本文地址github:https://github.com/yizhiamumu/pythonSample


readme.txt

公众号:一只阿木木

博客园:http://www.cnblogs.com/yizhiamumu/

github:https://github.com/yizhiamumu/

posted on   一只阿木木  阅读(1895)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示