python单线程和多线程爬取实例
时间: 2023-05-13 17:01:29 浏览: 159
Python是一种灵活的编程语言,其提供了多种多样的库和框架,以方便用户处理数据和进行网络爬取。在网络爬取方面,Python具有优秀的单线程和多线程爬取能力。
Python单线程爬取实例:
当我们需要爬取一个简单的网站时,单线程爬取可能是最简单和最有效的方法。例如,我们可以编写一个程序来爬取一个网站的所有页面,并将它们保存到本地文件夹中。这个程序可能像这样:
```Python
import requests
from bs4 import BeautifulSoup
def getUrls(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
urls = []
for link in soup.find_all('a'):
urls.append(link.get('href'))
return urls
def download(urls):
for url in urls:
response = requests.get(url)
filename = url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.content)
if __name__ == '__main__':
urls = getUrls('http://example.com')
download(urls)
```
在这个例子中,我们使用requests和BeautifulSoup库来获取和解析HTML页面,然后使用循环和文件I/O来保存页面内容。
Python多线程爬取实例:
当我们需要爬取大量页面时,单线程爬取可能会非常缓慢,因此我们可以使用多线程爬取来提高效率。例如,我们可以使用Python的多线程库threading来实现多线程爬取。下面是代码示例:
```Python
import requests
from bs4 import BeautifulSoup
import threading
def getUrls(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
urls = []
for link in soup.find_all('a'):
urls.append(link.get('href'))
return urls
def download(url):
response = requests.get(url)
filename = url.split('/')[-1]
with open(filename, 'wb') as f:
f.write(response.content)
class CrawlerThread(threading.Thread):
def __init__(self, url):
threading.Thread.__init__(self)
self.url = url
def run(self):
download(self.url)
if __name__ == '__main__':
urls = getUrls('http://example.com')
threads = []
for url in urls:
t = CrawlerThread(url)
threads.append(t)
t.start()
for t in threads:
t.join()
```
在这个例子中,我们使用多线程CrawlerThread类来下载每个页面。我们创建一个CrawlerThread列表,然后将列表中的每个元素作为参数传递给download函数,以便每个线程都可以执行下载任务。最后,我们使用join方法等待所有线程完成。
阅读全文