xpath学习_1

1、简单

1.1八爪鱼翻页采集

没有找到翻页采集元素

参考:(3条消息) XPATH基本语法_明月清风~~的博客-CSDN博客

八爪鱼蔡嘉琦:八爪鱼采集器8.x使用教程 - 八爪鱼采集器 (bazhuayu.com)教程

八爪鱼会自动判断并调整步骤在流程中的位置。对于点击【下一页】翻页,标准流程如下图所示,它的执行逻辑是:【打开网页】→【采集第1页列表数据】→【翻到第2页】→【采集第2页列表数据】......【翻到最后1页】→【采集最后1页列表数据】→【所有页数据采完,自动结束采集任务】。逻辑执行详情请查看 第8课:采集原理与流程执行逻辑

循环翻页逻辑

注意:翻页内嵌套循环就可以·

有时候不能自动识别,要自己循环点击下一页

1.2报错

参考文档网页数据翻页采集方法(最全) - 八爪鱼采集器 (bazhuayu.com)

像这样就可以

目标:https://www.coursera.org/courses?query=english%20writing

2.源代码学习

import requests
from lxml import etree
##etree可对HTML元素进行类似BeautifulSoup的查找,不过主要是基于XPath路径,而BeautifulSoup主要基于Selector路径。
url = 'https://www.coursera.org/courses?query=english%20writing'


resp = requests.get(url)
html = etree.HTML(resp.text)
course_list = html.xpath('//*[@id="rendered-content"]/div/div/div[1]/div/div[3]/div[1]/div[1]/div/div/div/div/div/div[2]/div/div/div/ul/li')


with open("courses.txt", "w") as file:
    for course in course_list:
        name = course.xpath('./div/div/a/div/div[2]/div/h2/text()')[0]
        file.write("课程名称:{}\n".format(name))

2.1etree主要函数:

etree主要函数:
etree.HTML():解析字符串格式的HTML文档对象,将字符串参数变为Element对象,以便使用xpath()等方法;
etree.tostring():将Element对象转换成字符串;
etree.fromstring():将字符串转换成Element对象。

2.1.1实例_爬取豆瓣

使用etree.HTML()解析web_data,并保存到web_html变量中,注意需使用.text取出web_data再传入.HTML()。
通过打印web_html,可见其为Element对象,类型为html,后续即可以web_html为基础进行元素查找。

2.1.2从豆瓣Top250电影网站获取电影名《肖申克的救赎》的XPath。

进入网页后按 Ctrl + Shift + C 选中电影名,右侧检查栏中找到电影名的<span></span>元素,右键 - Copy - Copy XPath。

2.1.3解析

对第1点中的web_html变量使用.xpath()方法,传入第2点中复制的XPath路径,保存至变量movie_name。
第一行print打印出movie_name的类型(type),可见是列表(list)类型,故需要使用第二行print中的movie_name[0]取出结果,可见其为Element类型对象,故需要使用第三行print中的movie_name[0].text获取对象中的文本。

2.1.4xpath路径查找

对比第一二电影《霸王别姬》的XPath路径

Xiao='//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]'

Wang='//*[@id="content"]/div/div[1]/ol/li[2]/div/div[2]/div[1]/a/span[1]'

可发现唯一的不同即为“ li[n] ”,第一部电影n为1,第二部电影n为2,故若去掉“ [n] ”去掉不同的,则可以获取所有的电影名(图中获取到网页中25部电影的Element对象,使用for循环对每个对象进行.text即可取出电影名):

movie_name = web_html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]')

print(movie_name)

我的爬取试炼

//*[@id="rendered-content"]/div/div/div[1]/div/div[3]/div[1]/div[1]/div/div/div/div/div/div[2]/div/div/div/ul/li[1]/div/div/a/div/div[2]/div[1]/h2

//*[@id="rendered-content"]/div/div/div[1]/div/div[3]/div[1]/div[1]/div/div/div/div/div/div[2]/div/div/div/ul/li[2]/div/div/a/div/div[3]/div[1]/h2

//*[@id="rendered-content"]/div/div/div[1]/div/div[3]/div[1]/div[1]/div/div/div/div/div/div[2]/div/div/div/ul/li/div/div/a/div/div/div[1]/h2

完整代码如下:

import requests
from lxml import etree
Headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
Url = 'https://movie.douban.com/top250'
web_data = requests.get(Url, headers=Headers)
 
web_html = etree.HTML(web_data.text)
movie_name = web_html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]')
# print(type(movie_name))
# print(movie_name[0])
# print(movie_name[0].text)
print(movie_name)

2.2获取headers

2.2.1获取战歌

import requests
url = "https://www.coursera.org/courses?query=english%20writing"
response = requests.get(url)
headers = response.headers
print(headers)
{'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 04 Feb 2023 01:11:42 GMT', 'etag': 'W/"8ce89-91sTBqEPgBVgVADBq2mqllj4eCg"', 'Server': 'envoy', 'Set-Cookie': 'CSRF3-Token=1676337102.9yP3Fksisjxv9i6k; Max-Age=864000; Expires=Tue, 14 Feb 2023 01:11:42 GMT; Path=/; Domain=.coursera.org, __204u=1877921903-1675473102191; Max-Age=31536000; Expires=Sun, 04 Feb 2024 01:11:42 GMT; Path=/; Domain=.coursera.org', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'Vary': 'Accept-Encoding', 'X-Content-Type-Options': 'nosniff', 'x-coursera-appname': 'seo-entity-page', 'X-Coursera-Internal-RequestType': 'serverRendered', 'X-Coursera-Render-Mode': 'html', 'X-Coursera-Render-Version': 'v2', 'X-Coursera-Request-Id': '4l9ZdqQoEe2OxxIsbsrghQ', 'X-Coursera-Trace-Id-Hex': '3401ddafb8c35075', 'x-envoy-upstream-service-time': '344', 'X-Frame-Options': 'SAMEORIGIN', 'x-powered-by': 'Express', 'X-XSS-Protection': '1; mode=block', 'transfer-encoding': 'chunked', 'Connection': 'keep-alive'}

2.2.2通过设置headers字典的'User-Agent'键的值来指定User AgenT

import requests
url = "https://www.coursera.org/courses?query=english%20writing"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}
response = requests.get(url, headers=headers)

import requests
from lxml import etree

获取headers
Headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
Url = 'https://www.coursera.org/courses?query=english%20writing'
web_data = requests.get(Url, headers=Headers)
 
web_html = etree.HTML(web_data.text)
course_name = web_html.xpath('//h2[@class="title-090"]/a')
for item in course_name:
    print(item.text)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈都婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值