爬虫系列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/
爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP的更多相关文章
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...
- 爬虫——正则表达式爬取豆瓣电影TOP前250的中英文名
正则表达式爬取豆瓣电影TOP前250的中英文名 1.首先要实现网页的数据的爬取.新建test.py文件 test.py 1 import requests 2 3 def get_Html_text( ...
- 爬取豆瓣电影TOP 250的电影存储到mongodb中
爬取豆瓣电影TOP 250的电影存储到mongodb中 1.创建项目sp1 PS D:\scrapy> scrapy.exe startproject douban 2.创建一个爬虫 PS D: ...
- Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...
- Python爬取豆瓣电影top
Python爬取豆瓣电影top250 下面以四种方法去解析数据,前面三种以插件库来解析,第四种以正则表达式去解析. xpath pyquery beaufifulsoup re 爬取信息:名称 评分 ...
- 用python爬取豆瓣电影Top 250
首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...
- requests+lxml+xpath爬取豆瓣电影
(1)lxml解析html from lxml import etree #创建一个html对象 html=stree.HTML(text) result=etree.tostring(html,en ...
- R语言爬虫:使用R语言爬取豆瓣电影数据
豆瓣排名前25电影及评价爬取 url <-'http://movie.douban.com/top250?format=text' # 获取网页原代码,以行的形式存放在web 变量中 web & ...
随机推荐
- QWaiteCondition 思考5
1: 一个QWaiteCondition(A) 和若干个QMutex(M) 协作 同步若干个QThread. 其中QWaiteCondition(A) 中存在一个列表(listmutex)保存和其协 ...
- 记录一次axios请求造成的数组初始化失败
axios请求是一个异步的请求,简单来讲就是在做其他事情的时候可以把这个先放一边等其他的事情做完后再来做这件事件. 我之前这样调用了一个方法: mounted() { this.first() thi ...
- vue学习之路一:安装vue-element-admin项目
今天看到一个vue网站,觉得很好,立马又有学习vue的冲动了,话不多说,直接贴项目网址: https://github.com/PanJiaChen/vue-element-admin/blob/ma ...
- 30天代码day3 Intro to Conditional Statements
Boolean A logical statement that evaluates to true or false. In some languages, true is interchangea ...
- webshell导致项目崩溃
mysql挂死,无法启动,解决mysql无法启动: /etc/my.cnf配置文件中innodb_force_recovery=1然后service mysqld start/etc/my.cnf配置 ...
- webbug3.0靶场第一关
目标一,由于用的kli系统,所以没有去手动注入,用了sqlmap来注入检测 先用sqlmap -u "http://192.168.199.136/pentest/test/sqli/sql ...
- 让Entity Framework不再私闯sys.databases
这里的“私闯sys.databases”是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名 ...
- c# excel xlsx 保存
public XSSFWorkbook Excel_Export(DataTable query,string title,int[] rowweight,string[] rowtitle) { X ...
- SOFARPC —— SPI 解析
一.前言 我之前研究过微博的Motan框架(当时接触的第一个RPC框架),当时懵懵懂懂,现在,上手SOFARPC框架,感觉比较轻松,事物的本质都是相通的.以前写博文,会逐行分析源码,慢慢地发现,源码其 ...
- cordova获取相册照片插件的使用方法:cordova-plugin-image-picker
1. 添加插件:cordova plugin add cordova-plugin-image-picker 2.调用方法: 3.参考 : http://www.cnblogs.com/lyxy/p/ ...