1. 首页
  2. 未分类

Python多线程豆瓣影评API接口爬虫

“u003Cdivu003Eu003Ch1u003Eu003Cstrongu003E爬虫库u003Cu002Fstrongu003Eu003Cu002Fh1u003Eu003Cpu003E使用简单的requests库,这是一个阻塞的库,速度比较慢。u003Cu002Fpu003Eu003Cpu003E解析使用XPATH表达式u003Cu002Fpu003Eu003Cpu003E总体采用类的形式u003Cu002Fpu003Eu003Ch1u003Eu003Cstrongu003E多线程u003Cu002Fstrongu003Eu003Cu002Fh1u003Eu003Cpu003E使用concurrent.future并发模块,建立线程池,把future对象扔进去执行即可实现并发爬取效果u003Cu002Fpu003Eu003Ch1u003Eu003Cstrongu003E数据存储u003Cu002Fstrongu003Eu003Cu002Fh1u003Eu003Cpu003E使用Python ORM sqlalchemy保存到数据库,也可以使用自带的csv模块存在CSV中。u003Cu002Fpu003Eu003Ch1u003Eu003Cstrongu003EAPI接口u003Cu002Fstrongu003Eu003Cu002Fh1u003Eu003Cpu003E因为API接口存在数据保护情况,一个电影的每一个分类只能抓取前25页,全部评论、好评、中评、差评所有分类能爬100页,每页有20个数据,即最多为两千条数据。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E因为时效性原因,不保证代码能爬到数据,只是给大家一个参考思路,上代码u003Cu002Fstrongu003E:u003Cu002Fpu003Eu003Cpreu003E 1 from datetime import datetimeu003Cbru003E 2 import randomu003Cbru003E 3 import csvu003Cbru003E 4 from concurrent.futures import ThreadPoolExecutor, as_completedu003Cbru003E 5 u003Cbru003E 6 from lxml import etreeu003Cbru003E 7 import pymysqlu003Cbru003E 8 import requestsu003Cbru003E 9 u003Cbru003E 10 from models import create_session, Commentsu003Cbru003E 11 u003Cbru003E 12 #随机UAu003Cbru003E 13 USERAGENT = [u003Cbru003E 14 ‘Mozillau002F5.0 (Windows NT 6.1; WOW64) AppleWebKitu002F535.1 (KHTML, like Gecko) Chromeu002F14.0.835.163 Safariu002F535.1’,u003Cbru003E 15 ‘Mozillau002F5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKitu002F537.36 (KHTML, like Gecko) Chromeu002F73.0.3683.103 Safariu002F537.36’,u003Cbru003E 16 ‘Mozillau002F5.0 (Windows NT 6.1; WOW64; rv:6.0) Geckou002F20100101 Firefoxu002F6.0’,u003Cbru003E 17 ‘Mozillau002F5.0 (Windows NT 6.1; WOW64) AppleWebKitu002F534.50 (KHTML, like Gecko) Versionu002F5.1 Safariu002F534.50’,u003Cbru003E 18 ‘Operau002F9.80 (Windows NT 6.1; U; zh-cn) Prestou002F2.9.168 Versionu002F11.50’,u003Cbru003E 19 ‘Mozillau002F5.0 (Windows; U; Windows NT 6.1; ) AppleWebKitu002F534.12 (KHTML, like Gecko) Maxthonu002F3.0 Safariu002F534.12’u003Cbru003E 20 ]u003Cbru003E 21 u003Cbru003E 22 u003Cbru003E 23 class CommentFetcher:u003Cbru003E 24 headers = {‘User-Agent’: ”}u003Cbru003E 25 cookie = ”u003Cbru003E 26 cookies = {‘cookie’: cookie}u003Cbru003E 27 # cookie为登录后的cookie,需要自行复制u003Cbru003E 28 base_node = ‘u002Fu002Fdiv[@class=”comment-item”]’u003Cbru003E 29 u003Cbru003E 30 u003Cbru003E 31 def __init__(self, movie_id, start, type=”):u003Cbru003E 32 ”’u003Cbru003E 33 :type: 全部评论:”, 好评:h 中评:m 差评:lu003Cbru003E 34 :movie_id: 影片的ID号u003Cbru003E 35 :start: 开始的记录数,0-480u003Cbru003E 36 ”’u003Cbru003E 37 self.movie_id = movie_idu003Cbru003E 38 self.start = startu003Cbru003E 39 self.type = typeu003Cbru003E 40 self.url = ‘https:u002Fu002Fmovie.douban.comu002Fsubjectu002F{id}u002Fcomments?start={start}&limit=20&sort=new_score\&status=P&percent_type={type}&comments_only=1’.format(u003Cbru003E 41 id=str(self.movie_id),u003Cbru003E 42 start=str(self.start),u003Cbru003E 43 type=self.typeu003Cbru003E 44 )u003Cbru003E 45 #创建数据库连接u003Cbru003E 46 self.session = create_session()u003Cbru003E 47 u003Cbru003E 48 #随机useragentu003Cbru003E 49 def _random_UA(self):u003Cbru003E 50 self.headers[‘User-Agent’] = random.choice(USERAGENT)u003Cbru003E 51 u003Cbru003E 52 u003Cbru003E 53 #获取api接口,使用get方法,返回的数据为json数据,需要提取里面的HTMLu003Cbru003E 54 def _get(self):u003Cbru003E 55 self._random_UA()u003Cbru003E 56 res = ”u003Cbru003E 57 try:u003Cbru003E 58 res = requests.get(self.url, cookies=self.cookies, headers=self.headers)u003Cbru003E 59 res = res.json()[‘html’]u003Cbru003E 60 except Exception as e:u003Cbru003E 61 print(‘IP被封,请使用代理IP’)u003Cbru003E 62 print(‘正在获取{} 开始的记录’.format(self.start))u003Cbru003E 63 return resu003Cbru003E 64 u003Cbru003E 65 def _parse(self):u003Cbru003E 66 res = self._get()u003Cbru003E 67 dom = etree.HTML(res)u003Cbru003E 68 u003Cbru003E 69 #id号u003Cbru003E 70 self.id = dom.xpath(self.base_node + ‘u002F@data-cid’)u003Cbru003E 71 #用户名u003Cbru003E 72 self.username = dom.xpath(self.base_node + ‘u002Fdiv[@class=”avatar”]u002Fau002F@title’)u003Cbru003E 73 #用户连接u003Cbru003E 74 self.user_center = dom.xpath(self.base_node + ‘u002Fdiv[@class=”avatar”]u002Fau002F@href’)u003Cbru003E 75 #点赞数u003Cbru003E 76 self.vote = dom.xpath(self.base_node + ‘u002Fu002Fspan[@class=”votes”]u002Ftext()’)u003Cbru003E 77 #星级u003Cbru003E 78 self.star = dom.xpath(self.base_node + ‘u002Fu002Fspan[contains(@class,”rating”)]u002F@title’)u003Cbru003E 79 #发表时间u003Cbru003E 80 self.time = dom.xpath(self.base_node + ‘u002Fu002Fspan[@class=”comment-time “]u002F@title’)u003Cbru003E 81 #评论内容 所有span标签class名为short的节点文本u003Cbru003E 82 self.content = dom.xpath(self.base_node + ‘u002Fu002Fspan[@class=”short”]u002Ftext()’)u003Cbru003E 83 u003Cbru003E 84 #保存到数据库u003Cbru003E 85 def save_to_database(self):u003Cbru003E 86 self._parse()u003Cbru003E 87 for i in range(len(self.id)):u003Cbru003E 88 try:u003Cbru003E 89 comment = Comments(u003Cbru003E 90 id=int(self.id[i]),u003Cbru003E 91 username=self.username[i],u003Cbru003E 92 user_center=self.user_center[i],u003Cbru003E 93 vote=int(self.vote[i]),u003Cbru003E 94 star=self.star[i],u003Cbru003E 95 time=datetime.strptime(self.time[i], ‘%Y-%m-%d %H:%M:%S’),u003Cbru003E 96 content=self.content[i]u003Cbru003E 97 )u003Cbru003E 98 u003Cbru003E 99 self.session.add(comment)u003Cbru003E100 self.session.commit()u003Cbru003E101 return ‘finish’u003Cbru003E102 u003Cbru003E103 u003Cbru003E104 except pymysql.err.IntegrityError as e:u003Cbru003E105 print(‘数据重复,不做任何处理’)u003Cbru003E106 u003Cbru003E107 except Exception as e:u003Cbru003E108 #数据添加错误,回滚u003Cbru003E109 self.session.rollback()u003Cbru003E110 u003Cbru003E111 finally:u003Cbru003E112 #关闭数据库连接u003Cbru003E113 self.session.close()u003Cbru003E114 u003Cbru003E115 #保存到csvu003Cbru003E116 def save_to_csv(self):u003Cbru003E117 self._parse()u003Cbru003E118 f = open(‘comment.csv’, ‘w’, encoding=’utf-8′)u003Cbru003E119 csv_in = csv.writer(f, dialect=’excel’)u003Cbru003E120 for i in range(len(self.id)):u003Cbru003E121 csv_in.writerow([u003Cbru003E122 int(self.id[i]),u003Cbru003E123 self.username[i],u003Cbru003E124 self.user_center[i],u003Cbru003E125 int(self.vote[i]),u003Cbru003E126 self.time[i],u003Cbru003E127 self.content[i]u003Cbru003E128 ])u003Cbru003E129 f.close()u003Cbru003E130 u003Cbru003E131 u003Cbru003E132 if __name__ == ‘__main__’:u003Cbru003E133 with ThreadPoolExecutor(max_workers=4) as executor:u003Cbru003E134 futures = []u003Cbru003E135 for i in [”, ‘h’, ‘m’, ‘l’]:u003Cbru003E136 for j in range(25):u003Cbru003E137 fetcher = CommentFetcher(movie_id=26266893, start=j * 20, type=i)u003Cbru003E138 futures.append(executor.submit(fetcher.save_to_csv))u003Cbru003E139 u003Cbru003E140 for f in as_completed(futures):u003Cbru003E141 try:u003Cbru003E142 res = f.done()u003Cbru003E143 if res:u003Cbru003E144 ret_data = f.result()u003Cbru003E145 if ret_data == ‘finish’:u003Cbru003E146 print(‘{} 成功保存数据’.format(str(f)))u003Cbru003E147 except Exception as e:u003Cbru003E148 f.cancel()u003Cbru003Eu003Cu002Fpreu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Faa76f04e43684f57805f170d9b6561fe” img_width=”268″ img_height=”281″ alt=”Python多线程豆瓣影评API接口爬虫” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:Python多线程豆瓣影评API接口爬虫

主题测试文章,只做测试使用。发布者:熱鬧獨處,转转请注明出处:http://www.cxybcw.com/18195.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code