在Python爬虫开发中,利用requests库进行网页数据抓取是一项基本技能。本文将详细介绍如何使用requests库结合多线程技术来抓取猫眼电影TOP100的电影信息。我们需要了解requests库的基本用法,以及如何处理网页源代码。
1. requests库的使用:
requests库是Python中一个强大的HTTP客户端库,可以方便地发送HTTP请求。在这个实例中,我们使用requests.get()函数来获取指定URL的网页内容。通过设置headers参数,我们可以模拟浏览器行为,绕过一些网站的反爬策略。例如,设置User-Agent字段来模拟Chrome浏览器的请求头。
```python
import requests
headers = {
'Content-Type': 'text/plain; charset=UTF-8',
'Origin': 'https://maoyan.com',
'Referer': 'https://maoyan.com/board/4',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
def get_one_page(url, headers):
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
```
2. 正则表达式解析HTML:
在获取到网页源代码后,我们需要从中提取出电影的信息,如排名、图片URL、电影名、主演和上映时间等。这通常需要用到正则表达式(re模块)进行匹配。下面的代码展示了如何编写正则表达式来匹配猫眼电影列表中的数据。
```python
import re
def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' +
'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
items = re.findall(pattern, html)
return items
```
3. 多线程抓取:
为了提高爬取效率,我们可以采用多线程。Python的threading模块可以创建线程并执行任务。在这个例子中,我们可能需要爬取多个页面(如每10部电影为一页),这时可以创建多个线程并行处理,加快抓取速度。
```python
import threading
def fetch_data(url, headers):
html = get_one_page(url, headers)
data = parse_one_page(html)
# 在这里对数据进行保存或处理
# 创建线程并启动
urls = ["https://maoyan.com/board/4", "https://maoyan.com/board/4/page-2"] # 假设我们要抓取第二页
threads = []
for url in urls:
thread = threading.Thread(target=fetch_data, args=(url, headers))
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
```
4. 数据存储:
在抓取到数据后,通常会将其保存到文件或数据库中。你可以选择JSON、CSV或数据库如SQLite进行存储。例如,将数据保存到CSV文件:
```python
import csv
def save_to_csv(data):
with open('cat-eye_movies.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['rank', 'image_url', 'title', 'actor', 'release_time', 'score_integer', 'score_fraction']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for item in data:
writer.writerow({'rank': item[0], 'image_url': item[1], 'title': item[2], 'actor': item[3], 'release_time': item[4], 'score_integer': item[5], 'score_fraction': item[6]})
# 在fetch_data或parse_one_page方法中调用save_to_csv
```
总结,本实例通过requests库获取猫眼电影TOP100的网页源代码,然后利用正则表达式解析HTML获取电影信息,最后通过多线程提升抓取速度,并将数据保存到本地文件。在实际的爬虫项目中,还需要考虑到异常处理、IP代理池、数据去重等问题,以确保爬虫的稳定性和高效性。同时,遵守网站的robots.txt协议,尊重网站的爬虫政策,是每个爬虫开发者应尽的责任。