我目前正在使用 python 开发一个网络爬虫,以利用多个 cpu 内核。这是我第一次尝试多处理,我在实现和概念上都遇到了一些问题。到目前为止,我只是为了开发而产生一个进程,它将抓取一个网站并从中获取我想要的内容,这不是问题。
当我想将孩子解析的 url 从页面发送回队列以使所有子进程都能够访问该队列以获得更多工作时,我的问题就开始了。
有了这个,我不知道如何用多个进程启动这个程序,让它们不断地获取/做工作,一旦完成就让它们加入()。由于 url 的数量显然是一个很大且未知的数字,我无法设置在终止之前完成的一些事情。
我欢迎任何和所有的批评和批评,因为我是一个崭露头角的 Python 开发人员。我也知道这是一个相当复杂的问题,非常感谢社区的帮助!
请不要建议我使用一些现有的网络爬虫,这对我来说是一种学习体验,所以使用一些现有的软件来爬虫对我没有帮助。
下面是我到目前为止的代码,让您了解我所拥有的和我所理解的。
import multiprocessing as mp
import re
import subprocess
import time
from bs4 import BeautifulSoup as bs4
import requests
class CrawlParseProcess(mp.Process):
def __init__(self, url):
mp.Process.__init__(self)
# This implies that a new process per URL which is not smart.
# Instead should the link queue be passed or something?
self.url = url
def run(self):
proc_name = self.name
response = requests.get(self.url)
links = self.link_parse(response.text, self.url)
def link_parse(self, html, url):
soup = bs4(html)
for link in soup.find_all('a'):
if link.has_attr('href'):
link = link.get('href')
if str(link).startswith('http') and 'example.com' in link:
print link
pattern = re.compile('http://www.example.com/.+\d/*')
if pattern.search(url):
return_obj = self.parse(html)
return_obj["date"] = time.time()
def parse(self, html):
soup = bs4(html)
return_obj = {
"url" : self.url,
"title" : soup.find('h1', {'itemprop' : 'name'}).text,
"date-added" : soup.find('div', {'class' : 'addedwhen clrfix'}).text,
"p" : soup.find('p', {'class' : 'time1'}).text,
"c" : soup.find('p', {'class' : 'time2'}).text,
"t" : soup.find('h3', {'class' : 'duration'}).text,
"items" : soup.find_all('li', {'itemprop' : 'items'}),
}
return return_obj
if __name__ == '__main__':
p = CrawlParseProcess("www.example.com")
p.start()
p.join()