昨天复习了进程和多进程的相关知识,今天实际再应用一下,通过多进程爬取豆瓣top100的电影评分。
- 爬取豆瓣TOP 250 可以用 接口 https://movie.douban.com/top250?start= 注意这个接口 start是从0 开始的代表 top 1
- 然后检查页面,找到影名,评分等信息
- 准备工作做好了,我们使用requests 和beautifulsoup 这两个包来提取信息,代码如下:
base_url = 'https://movie.douban.com/top250?start='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
}
res = requests.get(url=base_url,headers=headers)
soup = BeautifulSoup(res.text, 'html5lib')
info = soup.find('div', class_='info')
name = info.find('div',class_='hd').find('span',class_='title').text
print(name)
grade = info.find('div',class_='bd').find('span',class_='rating_num').text
print(grade)
inq = info.find('div',class_='bd').find('span',class_='inq').text
print(inq)
然后运行结果:
肖申克的救赎
9.6
希望让人自由。
这样我们就拿到了 top 1的信息,以此类推 下来我们就使用多进程,使用xpath包 来完成全部信息的爬取。完整代码如下:
from multiprocessing import Process,Queue
from time import time
from lxml import etree
import requests
base_url = 'https://movie.douban.com/top250?start='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36',
}
class DoubanSpider(Process):
def __init__(self,url,q):
super(DoubanSpider, self).__init__()
self.url = url
self.q =q
self.header = headers
print(self.url)
def parse_page(self):
try:
res =requests.get(self.url,headers=self.header)
except Exception as e:
print(e)
html = etree.HTML(res.text)
node_list = html.xpath("//div[@class='info']")
for move in node_list:
#影名
name = move.xpath('.//a/span/text()')[0]
# 评分
grade = move.xpath('.//div[@class="bd"]//span[@class="rating_num"]/text()')[0]
#评语
comment = move.xpath('.//div[@class="bd"]//span[@class="inq"]/text()')[0]
self.q.put({'影名':name,'评分':grade,'评语':comment})
def run(self):
self.parse_page()
def main():
#创建进程队列
q = Queue(5)
#构造top 250的链接 注意豆瓣的 链接中 start=0 代表top 1
url_list = [base_url+str(i) for i in range(0,225+1,25)]
#进程列表
process_list =[]
for url in url_list:
p = DoubanSpider(url,q)
p.start()
process_list.append(p)
for pro in process_list:
pro.join()
while not q.empty():
print(q.get())
if __name__ == '__main__':
start = time()
main()
end = time()
print(f"总耗时 :{end-start} 秒")
运行结果如下
明天开始复习线程,
加油!