豆瓣top205数据爬取
"""
1.先研究单页数据如何爬取
2.之后再研究多页数据如何爬取
3.最后可以考虑如何持久化保存
ps:2 3两个步骤有时候是混合进行的
"""
import requests # 请求库
from bs4 import BeautifulSoup # 解析库
from openpyxl import Workbook
import time
wb = Workbook()
wb1 = wb.create_sheet('电影排行数据', 0)
# 先创建表头数据
wb1.append(['电影名称', '电影详情', '电影图标', '电影信息', '电影评分', '评价人数', '电影座右铭'])
"""
研究多页规律
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
"""
def get_movie(url):
res = requests.get(url,
# 豆瓣需要校验User-Agent
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
}
)
soup = BeautifulSoup(res.text, 'lxml')
# 分析标签规律
li_list = soup.select("ol.grid_view>li")
# print(len(li_list)) # 最好验证一下
# 循环一个个li标签筛选所需内容
for li in li_list:
# 详情链接
a_link = li.find('a').get('href')
# 图标地址
img_src = li.find('img').get('src')
# 电影名称
movie_title = li.find('span').text
# 主要信息
info = li.select('div.bd>p')[0].text
# 评分
num = li.find('span', attrs={'class': 'rating_num'}).text
# 评价人数
people_num = li.select('div.star span')[-1].text
# 电影座右铭
quote_tag = li.select('p.quote span.inq')
'''并不是所有的电影都有该标签所以做判断'''
# if quote_tag:
# quote = quote_tag[0].text
# else:
# quote = '暂无'
# 三元表达式 缩写
quote = quote_tag[0].text if quote_tag else '暂无'
wb1.append([movie_title, a_link, img_src, info, num, people_num, quote])
for i in range(0, 250, 25):
base_url = 'https://movie.douban.com/top250?start=%s&filter='
get_movie(base_url % i)
time.sleep(1)
wb.save(r'movieInfo.xlsx')
解析库之Xpath解析器
必须掌握
# 效率很高 使用广泛
#1.导入xpath所在模块
from lxml import etree
# 2.将待匹配的 文本传入etree生成的一个对象
html = etree.HTML(doc)
xpath解析器主要功能
1.所有节点
a = html.xpath('//*') 匹配所有标签
2.指定节点(结果是个列表)
a = html.xpath('//head') 匹配所有的head标签
3.子节点,子孙节点
a = html.xpath('//div/a') 匹配div标签内部所有的子a标签
a = html.xpath('//bady/a') 匹配body标签内部所有的子a标签
a = html.xpath('//body//a')
4.父节点
a = html.xpath('//body//a[@href = "image1.html"]') 获取body内部所有href = image1.html的后代a
a = html.xpath('//body//a[@href ="image1.html"]/..') ..表示查找上一级父标签
5.标签
a = html.xpath('//body//a[1]') 从1开始取值
***xpath选择器中中括号内部可以放属性也可以放位置参数 从1开始***
a = html.xpath('//body//a[1]/parent::*')
6. 文本获取
a = html.xpath('//body//a[@href="image1.html"]/text()')
a =html.xpath('//body//a/text()') 获取body内部所有a内部文本(一次性获取不需要循环)
7.属性获取
a = html.xpath('//body//a/@href') 获取body内部所有后代a标签href属性值(一次性获取不需要循环)
a = html.xpath('//title/@id') # 获取title标签id属性值
8.属性多值匹配
a = 标签有多个class类, 直接匹配就不可以了,需要用contains
a = html.xpath('//body//a[@class="li"]') 写等号就表示等于 不是包含
要想用包含的写法
a = html.xpath('//body//a[contains(@class,"li")]/text()') 关键字contains
9.多属性匹配
查找body标签内部所有class含有li或者name=items的a标签
a = html.xpath('//body//a[contains(@class,"li")or @name="items"]')
查找body标签内部所有class含有li并且name=items的a标签的内部文本
a = html.xpath('//body//a[contains(@class,"li")and@name="items"]/text()')
10.按序选择
取最后一个
a = html.xpath('a//[last()]/@href')
位置小于3的
a = html.xpath('//a[position()<3]/@href') position()关键字 用于定位
倒数第三个
a = html.xpath('//a[last()-2]/@href')
了解即可
![]()
# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
a = html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
a = html.xpath('//a/ancestor::div')
# attribute:属性值
a = html.xpath('//a[1]/attribute::*') # 查找a标签内部所有的属性值
# child:直接子节点
a = html.xpath('//a[1]/child::*')
# descendant:所有子孙节点
a = html.xpath('//a[6]/descendant::*')
# following:当前节点之后所有节点
a = html.xpath('//a[1]/following::*')
a = html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
a = html.xpath('//a[1]/following-sibling::*')
a = html.xpath('//a[1]/following-sibling::a')
a = html.xpath('//a[1]/following-sibling::*[2]/text()')
a = html.xpath('//a[1]/following-sibling::*[2]/@href')
print(a)
View Code
xpath爬取猪八戒数据
import requests
from bs4 import BeautifulSoup
from lxml import etree
res = requests.get('https://shanghai.zbj.com/search/f/',
params={'kw': 'python'}
)
x_html = etree.HTML(res.text)
# 分析标签特征并书写xpath语法筛选
# 1.先查找所有的外部div标签
div_list = x_html.xpath('/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div') # 利用浏览器自动生成
# div_list = x_html.xpath('//div[@class="new-service-wrap"]/div') # 自己写
# 2.循环获取每一个div标签
for div in div_list:
price = div.xpath('.//span[@class="price"]/text()')
company_name = div.xpath('./div/div/a[1]/div[1]/p/text()')
order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
info = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()')
print(info)