给我一个基于request和lxml(xpath方法),使用2个for循环爬取网页中多页和多行数据的例子
时间: 2023-07-15 21:13:53 浏览: 109
好的,我们以爬取豆瓣读书标签为例子来演示。假设我们要爬取的是「小说」标签下的所有书籍信息,包括书名、作者、评分和评论人数。该标签下的书籍信息分为多页展示,每页有15本书。我们可以使用request和lxml库中的xpath方法来实现这个爬虫。
首先,我们需要构造请求并获取响应内容。由于每一页的URL地址中都包含了页码信息,我们可以使用一个循环来遍历所有页面。在每一页中,我们需要使用另外一个循环来遍历每一本书的信息。在代码中,我们使用了xpath方法来提取所需的信息,然后将其保存到一个列表中。最后,我们将所有书籍的信息保存到一个字典中,方便后续的数据处理和存储。
下面是代码实现:
```python
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/58.0.3029.110 Safari/537.3'}
# 待爬取的URL
url_template = 'https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4?start={}&type=T'
# 存储所有书籍信息的字典
books_dict = {}
# 遍历所有页面
for i in range(0, 60, 15): # 每页展示15本书,一共有60本书
url = url_template.format(i)
response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
# 遍历当前页面的所有书籍信息
for j in range(1, 16):
# 获取书名
title_xpath = '//*[@id="subject_list"]/ul/li[{}]/div[2]/h2/a/text()'
title = html.xpath(title_xpath.format(j))[0]
# 获取作者
author_xpath = '//*[@id="subject_list"]/ul/li[{}]/div[2]/div[1]/text()[1]'
author = html.xpath(author_xpath.format(j))[0].strip().split('/')[0]
# 获取评分
rating_xpath = '//*[@id="subject_list"]/ul/li[{}]/div[2]/div[2]/span[2]/text()'
rating = html.xpath(rating_xpath.format(j))[0]
# 获取评论人数
comments_xpath = '//*[@id="subject_list"]/ul/li[{}]/div[2]/div[2]/span[3]/text()'
comments = html.xpath(comments_xpath.format(j))[0]
comments = comments.strip('人评价')
# 将书籍信息保存到字典中
book = {'title': title, 'author': author, 'rating': rating, 'comments': comments}
books_dict[title] = book
# 打印结果
for title, book in books_dict.items():
print(title, book)
```
在上述代码中,我们使用了两个for循环来遍历所有页面和所有书籍信息。在每个循环中,我们使用了xpath方法来提取所需的信息,并将其保存到字典中。最终,我们打印出了所有书籍的信息。
需要注意的是,由于豆瓣网站具有反爬虫机制,因此我们在发送请求时需要设置一个User-Agent头信息,模拟浏览器访问网站。否则,豆瓣网站很有可能会拒绝我们的访问请求。
阅读全文