使用多线程,爬取杂文标签下的前10页所有书籍,包括书名、作者、出版社、出版 日期、页数、价格、ISBN号、豆瓣评分、评价人数、书籍封面、 URL)
时间: 2023-07-03 08:25:05 浏览: 124
好的,这是一个比较复杂的任务,需要用到 Requests、BeautifulSoup、re、threading 等模块和技术。下面是一份示例代码,供您参考:
```python
import requests
from bs4 import BeautifulSoup
import re
import threading
def get_book_info(url):
# 发送请求,获取页面内容
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"}
response = requests.get(url, headers=headers)
html = response.text
# 解析页面内容,提取书籍信息
soup = BeautifulSoup(html, 'html.parser')
book_list = soup.find_all('li', class_='subject-item')
for book in book_list:
# 获取书名
title = book.find('div', class_='info').h2.a['title']
# 获取作者、出版社、出版日期、页数、价格、ISBN号等信息
book_info = book.find('div', class_='pub').get_text().strip()
author = re.findall(r'作者: (.*)', book_info)[0]
press = re.findall(r'出版社: (.*)', book_info)[0]
pub_date = re.findall(r'出版年: (.*)', book_info)[0]
page_num = re.findall(r'页数: (.*)', book_info)[0]
price = re.findall(r'定价: (.*)', book_info)[0]
isbn = re.findall(r'ISBN: (.*)', book_info)[0]
# 获取豆瓣评分和评价人数
rating = book.find('span', class_='rating_nums').get_text()
comments = re.findall(r'(\d+)人评价', book.find('span', class_='pl').get_text())[0]
# 获取书籍封面和 URL
img_url = book.find('img')['src']
book_url = book.find('div', class_='pic').a['href']
# 输出书籍信息
print(title, author, press, pub_date, page_num, price, isbn, rating, comments, img_url, book_url)
def main():
# 构造 URL 列表
url_list = []
for i in range(10):
url = f'https://book.douban.com/tag/%E6%9D%82%E6%96%87?start={i*20}&type=T'
url_list.append(url)
# 创建线程池,启动多线程爬取数据
thread_pool = []
for url in url_list:
t = threading.Thread(target=get_book_info, args=(url,))
thread_pool.append(t)
t.start()
# 等待所有线程执行完成
for t in thread_pool:
t.join()
if __name__ == '__main__':
main()
```
在上面的代码中,我们先定义了一个 `get_book_info` 函数,用于爬取单个页面的书籍信息。然后,在 `main` 函数中,我们构造了包含前10页 URL 的列表,然后创建了一个线程池,将每个 URL 作为参数传递给 `get_book_info` 函数,并启动多个线程同时爬取数据。最后,我们等待所有线程执行完成后,程序结束。
需要注意的是,在实际的爬取过程中,我们还需要处理一些异常情况,比如请求失败、页面解析失败等等。此外,为了避免被封 IP,我们还需要设置一些健壮的爬虫策略,比如设置请求头信息、使用代理 IP、设置请求间隔时间等等。
阅读全文