python多线程爬虫大作业-Python多线程爬虫简单示例
时间: 2023-11-19 22:42:38 浏览: 108
python3爬虫中多线程的优势总结
好的,下面是一个简单的Python多线程爬虫示例:
```python
import requests
import threading
from queue import Queue
# 定义一个全局变量用来存储爬取到的数据
data = []
# 定义一个线程锁,防止多个线程同时写入数据导致数据错乱
lock = threading.Lock()
# 定义一个队列,用来存储待爬取的URL
url_queue = Queue()
# 定义一个爬取线程类
class CrawlerThread(threading.Thread):
def __init__(self, url_queue):
super().__init__()
self.url_queue = url_queue
def run(self):
while True:
# 从队列中获取一个URL
url = self.url_queue.get()
try:
# 发送请求并解析响应数据
response = requests.get(url)
content = response.text
# 对响应数据进行处理(此处省略)
# ...
# 将处理后的数据存入全局变量
with lock:
data.append(processed_data)
# 标记该URL已被处理
self.url_queue.task_done()
except Exception as e:
print(f"Error occurred while crawling {url}: {e}")
# 如果发生错误,将该URL重新放回队列
self.url_queue.put(url)
self.url_queue.task_done()
# 定义一个入口函数
def main():
# 初始化待爬取的URL列表
urls = ["http://www.example.com/page{}".format(i) for i in range(1, 11)]
# 将URL列表添加到队列中
for url in urls:
url_queue.put(url)
# 创建多个爬取线程并启动
for i in range(5):
t = CrawlerThread(url_queue)
t.start()
# 阻塞主线程,直到所有URL都被处理完毕
url_queue.join()
# 输出爬取结果
print(data)
if __name__ == '__main__':
main()
```
以上示例中,我们定义了一个`CrawlerThread`类来表示爬取线程,定义了一个`url_queue`队列来存储待爬取的URL,定义了一个`data`列表来存储爬取到的数据,以及定义了一个`lock`线程锁来保证多个线程访问`data`时不会出现数据错乱的情况。
在`main`函数中,我们首先将待爬取的URL列表添加到`url_queue`队列中,然后创建多个`CrawlerThread`实例并启动它们。最后,我们使用`url_queue.join()`方法来阻塞主线程,直到所有的URL都被处理完毕。
在`CrawlerThread`类的`run`方法中,我们使用`self.url_queue.get()`方法从`url_queue`队列中获取一个URL,然后发送请求并解析响应数据。如果处理过程中出现错误,我们将该URL重新放回队列中,以便后续线程重新处理。如果处理成功,我们将处理后的数据存入`data`列表中,并使用`self.url_queue.task_done()`方法标记该URL已被处理完毕。
需要注意的是,在多线程爬虫中,如果爬取的网站对IP访问频率有限制,可能会导致IP被封禁的情况。因此,在实际应用中,我们需要合理设置线程数量和请求频率,以避免被封禁的情况发生。
阅读全文