博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
阅读量:5073 次
发布时间:2019-06-12

本文共 4306 字,大约阅读时间需要 14 分钟。

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

【抓取】:参考前文 爬虫系列1:

【分页】:参考前文 爬虫系列2:

【保存】:参考前文 爬虫系列3:

【动态】:参考前文 爬虫系列4:

 

1 电影名称

# 1 Requests+Xpath 菜鸟爬取豆瓣TOP # 电影名称'''Requests+Xpath 爬取豆瓣电影安装 Python 应用包pip install requestspip install lxml获取元素的Xpath信息并获得文本:手动获取:定位目标元素,在网站上依次点击:右键 > 检查file=s.xpath('元素的Xpath信息/text()') 快捷键“shift+ctrl+c”,移动鼠标到对应的元素时即可看到对应网页代码:在电影标题对应的代码上依次点击 右键 > Copy > Copy XPath,获取电影名称的Xpath:'''import requests from lxml import etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=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 etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=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 timefrom lxml import etreeurl = 'https://book.douban.com/top250'data = requests.get(url).texts=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 etreefor 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人评价,献给长成了大人的孩子们

 


readme.txt

公众号:一只阿木木

转载于:https://www.cnblogs.com/yizhiamumu/p/9451093.html

你可能感兴趣的文章
计算机网络(谢希仁 第七版)运输层 个人笔记
查看>>
设计模式之七:适配器模式(火鸡转换成鸭子)
查看>>
面向对象进阶
查看>>
操刀 requirejs,自己动手写一个
查看>>
初学jmeter
查看>>
C#画图
查看>>
Date类型 - 实践
查看>>
代码复审
查看>>
第四十篇 入门机器学习——Numpy.array的基本操作——向量及矩阵的运算
查看>>
Elasticsearch学习之深入聚合分析五---案例实战
查看>>
CF #355div2 D 宝藏与钥匙 dp 二维数组智商题
查看>>
基于S3C2440的linux-3.6.6移植——LED驱动【转】
查看>>
linux设备驱动归纳总结(四):3.抢占和上下文切换【转】
查看>>
scrapy中使用 IP 代理
查看>>
Numpy 矩阵库(Matrix)
查看>>
Table View Programming Guide for iOS---(三)----Overview of the Table View API
查看>>
VSCode搭建Vue项目
查看>>
POJ 2175 Evacuation Plan
查看>>
UVALive 4976 Defense Lines
查看>>
.Net中集合排序的一种高级玩法
查看>>