1、简单
1.1八爪鱼翻页采集
没有找到翻页采集元素
![](https://i-blog.csdnimg.cn/blog_migrate/8a403f6ef10a6e5559edd6973f677ab5.png)
参考:(3条消息) XPATH基本语法_明月清风~~的博客-CSDN博客
八爪鱼蔡嘉琦:八爪鱼采集器8.x使用教程 - 八爪鱼采集器 (bazhuayu.com)教程
八爪鱼会自动判断并调整步骤在流程中的位置。对于点击【下一页】翻页,标准流程如下图所示,它的执行逻辑是:【打开网页】→【采集第1页列表数据】→【翻到第2页】→【采集第2页列表数据】......【翻到最后1页】→【采集最后1页列表数据】→【所有页数据采完,自动结束采集任务】。逻辑执行详情请查看 第8课:采集原理与流程执行逻辑。
循环翻页逻辑
![](https://i-blog.csdnimg.cn/blog_migrate/ca965fe977fbf096f6f5f81a935a834b.png)
注意:翻页内嵌套循环就可以·
有时候不能自动识别,要自己循环点击下一页
![](https://i-blog.csdnimg.cn/blog_migrate/e6dc3a0edafe75f207f6ef8e3993ffaa.png)
1.2报错
参考文档网页数据翻页采集方法(最全) - 八爪鱼采集器 (bazhuayu.com)
就像这样就可以
![](https://i-blog.csdnimg.cn/blog_migrate/cd7483108eedd3a1ae734def60618ce1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6efac06270742c3815a9ac739e7663e.png)
目标: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为基础进行元素查找。
![](https://i-blog.csdnimg.cn/blog_migrate/023a75328a54a9cb901c191dbb7926ed.png)
2.1.2从豆瓣Top250电影网站获取电影名《肖申克的救赎》的XPath。
进入网页后按 Ctrl + Shift + C 选中电影名,右侧检查栏中找到电影名的<span></span>元素,右键 - Copy - Copy XPath。
![](https://i-blog.csdnimg.cn/blog_migrate/dd63b6363442ee8d21d080002a5aa29f.png)
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获取对象中的文本。
![](https://i-blog.csdnimg.cn/blog_migrate/70eb970c8fe8121db3829adcb71e5ef9.png)
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)