selector = parsel.Selector(html_data) lis = selector.css('.list_item h2 a::attr(href)').getall() details = [] for li in lis: detail_url = 'https://travel.qunar.com' + li detail_html = requests.get(detail_url).text details.append(detail_html) time.sleep(random.randint(3, 5)) # 每次请求后等待一段时间,避免请求频繁被封 for detail_html in details: # 解析数据 detail_selector = parsel.Selector(detail_html) title = detail_selector.css('.b_crumb_cont *:nth-child(3)::text').get() comment = detail_selector.css('.title.white::text').get() view_count = detail_selector.css('.view_count::text').get() date = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get() days = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get() money = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get() character = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get() play_list = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data > span::text').getall() for play in play_list: print(play) print(title, comment, view_count, date, days, money, character, play_list, detail_url)这段代码输出的文字可以匹配,但是网站都是同一个,要怎么改
时间: 2024-03-29 14:39:48 浏览: 69
这段代码是爬取了一个页面中多篇游记的链接,然后依次爬取每篇游记的详情页,并解析其中的数据。由于您爬取的是同一个网站的多篇游记,所以每篇游记的详情页链接都是相同的。如果您想爬取不同网站的游记,可以修改`detail_url`的值为对应的网址。
如果您想爬取同一个网站的不同分类、不同标签或不同页面的游记,可以修改`html_data`的值为对应页面的HTML源码,并修改`lis`的值为对应页面中游记链接所在的CSS选择器。例如,如果您要爬取https://travel.qunar.com/travelbook/list.htm?order=hot_heat页面中所有游记的链接,可以将`lis`的值修改为`.list_item h2 a::attr(href)`。
请注意,网站的反爬虫机制比较严格,频繁地爬取同一个页面可能会导致IP被封禁,建议使用代理IP或降低爬取频率。
相关问题
selector=parsel.Selector(html_data)
这段代码使用了Parsel库中的Selector类来解析HTML数据。Parsel是一个基于lxml的轻量级Python库,可以用于解析HTML和XML数据,并提供了类似于XPath的语法来选择和提取数据。在这里,我们使用Selector类来创建一个可以用于选择HTML元素的对象,并将HTML数据作为参数传入。
selector = parsel.Selector(html_data) lis = selector.css('.list_item h2 a::attr(href)').getall() details = [] for li in lis: detail_url = 'https://travel.qunar.com'+ li detail_html = requests.get(detail_url).text只能输出最后一个域名的网站
根据您提供的代码,您将多个域名与一个网站合并的方式是将多个 detail_url 存储在一个列表中,然后对列表进行循环遍历,依次发送请求获取每个网站的 html 数据。
在循环中,您使用 `detail_url = 'https://travel.qunar.com'+ li` 将当前遍历到的 li 和 'https://travel.qunar.com' 进行拼接,从而获取完整的 detail_url。但是,您没有将获取到的每个网站的 html 数据存储在一个列表中,而是每次都将获取到的 html 数据赋值给了 detail_html 变量,因此最终 detail_html 只会保存最后一个网站的 html 数据。
为了解决这个问题,您可以将每个网站的 html 数据存储在一个列表中,然后在循环结束后对列表进行处理。修改后的代码如下:
```python
selector = parsel.Selector(html_data)
lis = selector.css('.list_item h2 a::attr(href)').getall()
details = []
for li in lis:
detail_url = 'https://travel.qunar.com' + li
detail_html = requests.get(detail_url).text
details.append(detail_html)
# 对获取到的每个网站的 html 数据进行处理
for detail_html in details:
# 处理代码
pass
```
这样,每次获取到的网站的 html 数据都会被存储在 details 列表中,循环结束后可以对列表中的数据进行处理。
阅读全文