python子线程解析豆瓣

本文介绍了一种使用Python和多线程技术从豆瓣网站抓取电影数据的方法。通过构建请求头,解析JSON响应,获取电影列表,并进一步抓取每个电影的详细信息,包括电影名、演员、评分和简介。该爬虫利用lxml库解析HTML,requests库发送HTTP请求,以及threading库实现多线程加速数据抓取。
摘要由CSDN通过智能技术生成
from lxml import etree
import requests, json
from threading import Thread
from time import time
 # 构建请求头
    class Douban():
	    def __init__(self):
	        self.headers = {
	            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
	        }
	
	    # 列表页所有url
	    def response_url_list(self, url_list):
	
	        response = requests.get(url_list, self.headers,)
	
	        result = json.loads(response.text)['subjects']
		#将url解析出的存入列表返回
	        res_url = []
	        for i in result:
	            url_list_name = i['url']
	            res_url.append(url_list_name)
	        return res_url
	
	    # 详细页 url 和获取详细页信息
	    def resp_get(self, j):
	        response = requests.get(j, self.headers)
	        res_html = etree.HTML(response.text)
	        restult = {}
	        # 电影名
	        restult['电影名'] = res_html.xpath("//div[@id='wrapper']//h1/span/text()")[0]
	        # 演员
	        restult['演员'] = res_html.xpath('//div[@id="info"]//span/span/a/text()')
	        # 评分
	        restult['评分'] = res_html.xpath("//div[@class='rating_wrap clearbox']/div/strong/text()")[0]
	        # 简洁
	        restult['简介'] = res_html.xpath("//div[@class='related-info']/div/span/text()")[0].strip()
	        print(restult)
	
	
	if __name__ == '__main__':
	    # 实例化
	    douban = Douban()
	    # 查看子线程用时
	    st_time = time()
	    # 列表页的url
	    print('提示:','热门','最新','经典' ,'可播放','豆瓣高分' ,'冷门佳片','华语','欧美','韩国','日本','动作','喜剧','爱情','科幻','悬疑','恐怖','成长')
	    a = input('请输入需要查询类别:')
	    b = int(input('请输入需要查询页数:'))
	    url_list = 'https://movie.douban.com/j/search_subjects?type=movie&tag={}&sort=recommend&page_limit=20&page_start={}'.format(a,(b-1)* 20)
	    print('正在解析列表页{}'.format(b))
	    # 接收返回值的列表页下的所有url
	    list_url_resp = douban.response_url_list(url_list)
	    t_list = []
	    for j in list_url_resp:
	        t = Thread(target=douban.resp_get, args=(j,))
	        t.start()
	        t_list.append(t)
	
	    [i.join() for i in t_list]
	
	
	    print('多任务时,共耗时:{}'.format(time() - st_time))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值