以下是项目所使用的框架,不同的项目所使用的框架或许有不同,但都万差不离:
BeautifulSoup:一个用于从HTML和XML文件中提取数据的Python库。
PySpider:一个轻量级,跨平台并基于事件的Python爬虫框架。
Tweepy:一个用于访问Twitter API的Python库,可用于采集Twitter数据。
Selenium:一个用于自动化Web浏览器的Python库,可用于模拟用户在网站上的操作。
如果有已更新的爬虫项目对大家的学习有帮助的话,可以点赞,打赏
如果有希望更新的爬虫也可以给博主提交,后续的更新中有可能就是你想学习的哦~
注意:本系列所有的项目无论代码还是数据,仅供个人学习;毕业设计等参考使用,不允许直接使用在任何商业领域!如需要在商业领域使用请自行修改或定制!
本章为爬虫部分的讲解,如需要数据处理方面及机器学习等的应用案例,请关注博主的后续文章!
哔哩哔哩 | QQ音乐 | 东方财富 | 中医资源 | 京东 | 今日头条 | 动漫人物 | 去哪儿 | 天气后报网 | 学习强国 |
拉勾网 | 新浪微博 | 汽车之家 | 淘宝网 | 知乎 | 网易云音乐 | 腾讯新闻 | 读书网 | 豆瓣电影 | 豌豆夹 |
起点中文网 | 4399小游戏 | 天天基金 | 抖音 | 豆瓣读书 | Steam | ||||
当我们谈起哔哩哔哩(Bilibili)时,很多人会想到它是一个弹幕视频网站,但事实上这个平台已经不仅仅是一个视频网站了。
哔哩哔哩成立于2009年,最初是一个以ACG(动漫、漫画、游戏)为主题的弹幕视频分享平台,它的独特之处就在于用户可以在视频上发表弹幕评论。这种弹幕形式让观众和内容创作者之间建立了更为紧密的联系,而当时的Bilibili也因此获得了众多ACG爱好者的追捧。
在经过多年的运营和发展之后,哔哩哔哩不仅成长为中国最具影响力的弹幕视频平台之一,还成为了拥有众多粉丝的文化娱乐社区。现在,哔哩哔哩已经涵盖了游戏、音乐、电影、综艺等多个领域,成为一个综合性的互联网文化平台,拥有亿万用户和众多的优质内容。
哔哩哔哩的用户文化也非常独特。在这个平台上,用户可以自由发表评论、发布视频、参与各种讨论活动,还可以和其他用户组成团队,打造属于自己的社群文化。而且,哔哩哔哩的用户群体年轻化程度比较高,这也促进了平台上各种潮流文化和年轻人的创新。
总体来说,哔哩哔哩不仅仅是一个视频网站,更是一个充满活力和自由的文化社区。未来,哔哩哔哩还将继续探索新的领域,为用户提供更好更有趣的内容和体验。
普通用途:大屏可视化、评论情绪分析等
进阶用途:喜好分析,推荐算法,趋势分析等
for key, value in paloads.items(): json_data = getVideoList(key, 1) total = json_data['data']['total'] // 20 + 1 for page in range(1, total): try: json_data = getVideoList(key, page) for video in json_data['data']['list']: saveCSV(key, video) progress_bar(key, page, total,video['title']) except Exception as e: print(e,json_data,paloads[key]['url'].format(page)) # 跳过错误,继续执行 continue
for index, row in video_list.iterrows(): try: media_id = row['media_id'] url = 'https://www.bilibili.com/bangumi/media/md{}'.format(media_id) response = requests.get(url) jsonText = json.loads(re.search(r"window\.__INITIAL_STATE__=(.*?)};", response.text).group(1) + '}') styless = jsonText['mediaInfo']['styles'] style = '' for styles in styless: style += styles['name'] + ' ' a = { 'media_id': [str(response.url).split('/md')[1]], 'actors': [jsonText['mediaInfo']['actors'].replace('\n', ' ').replace('、', ' ')], 'staff': [jsonText['mediaInfo']['staff'].replace('、', ' ')], 'introduction': [jsonText['mediaInfo']['evaluate']], 'season_version': [style], 'danmaku_count': [jsonText['mediaInfo']['stat']['danmakus']], 'play_count': [jsonText['mediaInfo']['stat']['views']], 'follow_count': [jsonText['mediaInfo']['stat']['favorites']], 'series_follow': [jsonText['mediaInfo']['stat']['series_follow']] } info_list = pd.DataFrame(a) info_list.to_csv('dataset/bilibili_video_info.csv', index=False,mode='a',header=False) progress_bar('视频信息爬取进度', index + 1, len(video_list), str(response.url).split('/md')[1]) except Exception as e: print(e) continue
for index, row in video_list.iterrows(): try: media_id = row['media_id'] page = '' while True: json_data = getVideoList(media_id,page) if json_data['data']['list'] == None: break for video in json_data['data']['list']: saveCSV(video) progress_bar('视频评论爬取进度', index + 1, len(video_list), video['content']) page += 1 if page > 10: break except Exception as e: continue
for index, row in video_list.iterrows(): url = row['cover_img'] media_id = row['media_id'] r = requests.get(url) with open('output/images/{}.jpg'.format(media_id), 'wb') as f: f.write(r.content) print('正在下载第' + str(index) + '张图片'+'共'+str(len(video_list))+'张'+',图片名为:'+str(row['media_id']) + '.jpg')
QQ音乐是一款中国大陆的在线音乐播放器,由腾讯公司推出,提供了海量的音乐资源,包括国内外最热门的歌曲、最新的音乐专辑、MV等。用户可以通过QQ音乐听歌、搜索歌曲、创建歌单、分享音乐等功能,同时还可以进行付费下载、在线听歌等操作。QQ音乐还拥有个性化推荐功能,根据用户的喜好和听歌历史,自动推荐精准的音乐,让用户更好地享受音乐的乐趣。
大屏可视化,喜好分析等
for url in urls: html = requests.get(url['url']).text html = BeautifulSoup(html, 'lxml') song_list = html.find('ul', class_='songlist__list').find_all('li') for song in song_list: top_num = song.find('div', class_='songlist__number').text song_name = song.find('span', class_='songlist__songname_txt').text is_vip = song.find('i', class_='songlist__icon songlist__icon_vip sprite') is_mv = song.find('a', class_='songlist__icon songlist__icon_mv sprite') song_author = song.find('a', class_='playlist__author').text song_time = song.find('div', class_='songlist__time').text song_url = song.find('a', class_='songlist__cover')['href'] a = { 'top_name': [url['name']], 'top_num': [top_num], 'song_name': [song_name], 'is_vip': ['VIP' if is_vip else ''], 'is_mv': ['MV' if is_mv else ''], 'song_author': [song_author], 'song_time': [song_time], 'song_url': ['https://y.qq.com{}'.format(song_url)] } print(a) top_list = pd.DataFrame(a) top_list.to_csv('dataset/top_list.csv', index=False,mode='a',header=False)
for singer in singer_list: singer_name = singer.find_element(By.TAG_NAME,'a').text singer_url = singer.find_element(By.TAG_NAME,'a').get_attribute('href') singer_id = singer_url.split('/')[-1] print(singer_name, singer_url, singer_id) a = { 'singer_id': [singer_id], 'singer_name': [singer_name], 'singer_url': [singer_url] } df = pd.DataFrame(a) df.to_csv('dataset/singer_list.csv', mode='a', header=False, index=False)
for index,value in singer_list.iterrows(): try: singer_info, song_list = getPage(value['singer_url']) print('歌手:{},歌曲:{},歌曲数:{},进度:{}/{}'.format(value['singer_name'], singer_info['singer_song_num'], len(song_list), index + 1, len(singer_list))) singer_list.loc[singer_list['singer_id'] == value['singer_id'], 'singer_intro'] = singer_info['singer_intro'] singer_list.loc[singer_list['singer_id'] == value['singer_id'], 'singer_song_num'] = singer_info[ 'singer_song_num'] singer_list.loc[singer_list['singer_id'] == value['singer_id'], 'singer_album_num'] = singer_info[ 'singer_album_num'] singer_list.loc[singer_list['singer_id'] == value['singer_id'], 'singer_mv_num'] = singer_info['singer_mv_num'] singer_list.loc[singer_list['singer_id'] == value['singer_id'], 'singer_fans_num'] = singer_info[ 'singer_fans_num'] singer_list.to_csv('dataset/singer_list.csv', index=False) song_list = pd.DataFrame(song_list) song_list['singer_id'] = value['singer_id'] song_list = song_list[ ['singer_id', 'singer_song_id', 'singer_song_name', 'singer_song_url', 'singer_song_album_name', 'singer_song_album_url', 'singer_song_time']] song_list.to_csv('dataset/song_list.csv', mode='a', header=False, index=False) except Exception as e: print(e) pass
东方财富是中国领先的互联网金融信息及数据服务提供商。公司成立于1994年,总部位于中国上海市。东方财富提供股票、基金、债券、期货等多种金融产品的信息服务,涵盖了全球各地区的金融市场数据和研究报告。东方财富还提供投资咨询、金融科技解决方案等服务。目前,公司已经成为中国最大的金融信息服务平台之一,拥有超过6000万活跃用户。
可视化,预测,推荐,关键字等
def parse(self, response): key = response.meta['key'] url = response.meta['url'] # 将响应数据转换为json数据 json_data = response.text #去掉响应数据中的jQuery(和后面的),只保留()中的json数据 json_data = json_data[json_data.find('(')+1:json_data.rfind(')')] #将json数据转换为字典 json_data = json.loads(json_data) #获取数量总数 total_size = json_data['data']['total'] #获取当前页码 current_page = response.meta['page'] #获取每页数量 page_size = response.meta['page_size'] #计算总页数 total_page = math.ceil(total_size/page_size) #获取当前页的数据 data = json_data['data']['diff'] #遍历当前页的数据 for item in data: ''' f12:股票代码 f14:股票名称 f2:最新价 f3:涨跌幅 f4:涨跌额 f5:成交量 f6:成交额 f7:振幅 f8:换手率 f9:市盈率 f10:量比 f11:5分钟涨跌幅 f13:涨或跌 1涨 0跌 f15:最高价 f16:最低价 f17:今开价 f18:昨收价 f20:总市值(单位元) f21:流通市值(单位元) f22:涨速 f23:市净率 f24:60日涨跌幅 f25:年初至今涨跌幅 f26:上市时间 f115:市盈率(动态) ''' sli = StockListItem() #分类 sli['category'] = key #获取股票代码 sli['code'] = item['f12'] #获取股票名称 sli['name'] = item['f14'] #获取最新价 sli['price'] = item['f2'] #获取涨跌幅 sli['change_percent'] = item['f3'] #获取涨跌额 sli['change_amount'] = item['f4'] #获取成交量 sli['volume'] = item['f5'] #获取成交额 sli['amount'] = item['f6'] #获取振幅 sli['amplitude'] = item['f7'] #获取换手率 sli['turnover_rate'] = item['f8'] #获取市盈率 sli['pe'] = item['f9'] #获取量比 sli['volume_ratio'] = item['f10'] #获取5分钟涨跌幅 sli['five_minute_change_percent'] = item['f11'] #获取涨或跌 1涨 0跌 sli['up_or_down'] = item['f13'] #获取最高价 sli['high_price'] = item['f15'] #获取最低价 sli['low_price'] = item['f16'] #获取今开价 sli['open_price'] = item['f17'] #获取昨收价 sli['close_price'] = item['f18'] #获取总市值(单位元) sli['total_market_value'] = item['f20'] #获取流通市值(单位元) sli['circulation_market_value'] = item['f21'] #获取涨速 sli['change_speed'] = item['f22'] #获取市净率 sli['pb'] = item['f23'] #获取60日涨跌幅 sli['sixty_day_change_percent'] = item['f24'] #获取年初至今涨跌幅 sli['year_to_date_change_percent'] = item['f25'] #获取上市时间 sli['listing_date'] = item['f26'] #获取市盈率(动态) sli['dynamic_pe'] = item['f115'] yield sli # 打印key,数量总数,当前页码,每页数量,总页数 if current_page < total_page: print({ '分类': key, '数量总数': total_size, '当前页码': current_page, '每页数据量': page_size, '总页数': total_page, }) #如果当前页码小于总页数,继续发送请求 current_page += 1 yield scrapy.Request( url=url.format(current_page,page_size,key), callback=self.parse, meta={'page':current_page,'page_size':page_size,'key':key,'url':url} )
def parse(self, response): code = response.meta['code'] name = response.meta['name'] category = response.meta['category'] json_data = json.loads(response.text)['dstx'] data = json_data['data'] for item in data: sni = StockNoticeItem() sni['code'] = code sni['name'] = name sni['category'] = category sni['event_type'] = item[0]['EVENT_TYPE'] sni['level1_content'] = item[0]['LEVEL1_CONTENT'] sni['level2_content'] = item[0]['LEVEL2_CONTENT'] sni['notice_date'] = item[0]['NOTICE_DATE'] sni['specific_eventtype'] = item[0]['SPECIFIC_EVENTTYPE'] yield sni hasNext = json_data['hasNext'] if hasNext==1: pageIndex = response.meta['pageIndex'] url = self.paloads['getDate'].format(code, pageIndex+1) yield scrapy.Request(url=url, callback=self.parse, meta={'code': code, 'name': name, 'category': category, 'pageIndex': pageIndex+1}) pass
def parse(self, response): code = response.meta['code'] name = response.meta['name'] category = response.meta['category'] json_data = json.loads(response.text) json_data = json_data['data'] date = '' for item in json_data: date = date + str(item['REPORT_DATE']).split(' ')[0] +',' date = date[:-1] url = self.paloads['getInfo'].format(date,response.meta['code']) yield scrapy.Request(url=url, callback=self.parse_info, meta={'code':code,'name':name,'category':category}) pass
def parse(self, response): # 去掉响应数据中的jQuery(和后面的),只保留()中的json数据 json_data = response.text[response.text.find('(') + 1:response.text.rfind(')')] json_data = json.loads(json_data) print(json_data['data']) # code code = json_data['data']['code'] # name name = json_data['data']['name'] # klines klines = json_data['data']['klines'] for kline in klines: skli = StockKLineItem() # 代码 skli['code'] = code # 名称 skli['name'] = name # 日期 skli['date'] = kline.split(',')[0] # 开盘价 skli['open'] = kline.split(',')[1] # 收盘价 skli['close'] = kline.split(',')[2] # 最高价 skli['high'] = kline.split(',')[3] # 最低价 skli['low'] = kline.split(',')[4] # 成交量 skli['volume'] = kline.split(',')[5] # 成交额 skli['amount'] = kline.split(',')[6] # 振幅 skli['amplitude'] = kline.split(',')[7] # 涨跌幅 skli['change_percent'] = kline.split(',')[8] # 涨跌额 skli['change_amount'] = kline.split(',')[9] # 换手率 skli['turnover_rate'] = kline.split(',')[10] print('当前正在爬取的股票代码为:{},名字:,日期:{}'.format(code,skli['name'],skli['date'])) yield skli pass
中医资源网是一个集中医相关信息、知识、资源的网站,包含中医药相关的疾病诊疗、中药方剂、针灸推拿、养生保健、文化传承等多个方面内容。用户可以在网站上查找中医病案、中药方剂、针灸推拿技术、中医养生保健、中医文化传承等方面的资料,也可以参加在线教育培训,学习中医相关专业知识和技能。中医资源网的宗旨是传承和发扬中医药文化,推广中医药知识和技术,提高公众的健康意识和健康素养,促进中医药事业的发展。
可视化,问答机器人,推荐
def parse(self, response): # 获取拼音索引 pinyin = response.meta['pinyin'] # 获取所有的药品 # 使用xpath定位id为"DataList1"的table table = response.xpath('//*[@id="DataList1"]') # 使用xpath定位table下的所有tr trs = table.xpath('./tr') # 遍历trs for tr in trs: # 使用xpath定位tr下的所有td tds = tr.xpath('./td') # 遍历tds for td in tds: # 取出td中第二个a标签的文本,链接 name = td.xpath('./a[2]/text()').extract_first() link = td.xpath('./a[2]/@href').extract_first() link = 'http://www.tcmdoc.cn/shujuku/zhongyao/{}'.format(link) zhongyao = ZhongyaoItem() zhongyao['name'] = name zhongyao['link'] = link zhongyao['pinYin_index'] = pinyin zhongyao['image_urls'] = '' zhongyao['pinYin_name'] = '' zhongyao['alias'] = '' zhongyao['source'] = '' zhongyao['habitat'] = '' zhongyao['taste'] = '' zhongyao['function'] = '' zhongyao['dosage'] = '' zhongyao['excerpt'] = '' zhongyao['character'] = '' zhongyao['processing'] = '' zhongyao['protomorph'] = '' zhongyao['remarks'] = '' yield scrapy.Request(url=link, callback=self.parse_detail,meta={'zhongyao':zhongyao}) pass
京东网,简称京东,是中国最大的综合性电子商务公司之一,成立于2004年,总部位于北京市。京东商城提供一站式的电子商务解决方案,包括在线购物、客户服务、物流配送等业务,为消费者提供优质的商品选择和购物体验。京东商城的产品包括家电、手机、电脑数码、服装、家居、母婴、食品等多个品类,同时也提供海外购、团购、超市等服务。京东商城以“诚信、共赢、客户为先、追求卓越”为核心价值观,致力于成为全球领先的电子商务企业。
可视化,推荐,预测
def parse(self, response): keyword = response.meta['keyword'] print('>>>>>>>>>>>>>>>>>keyword:', keyword) # 使用xpath解析数据,定位到id为J_goodsList的div标签,然后再定位到所有的li标签 li_list = response.xpath('//div[@id="J_goodsList"]/ul/li') for li in li_list: item = JdGoodsItem() # 使用xpath解析数据,定位到id为J_goodsList的div标签,然后再定位到所有的li标签 item['keyword'] = keyword['keyword'] item['title'] = li.xpath('./div/div[@]/a/em/text()').extract_first() # 去掉特殊字符 try: item['title'] = item['title'].replace('\n', '').replace('\r', '').replace('\t', '').replace(' ', '') except: pass try: item['link'] = 'https:' + li.xpath('./div/div[@]/a/@href').extract_first() except: item['link'] = '' item['price'] = li.xpath('./div/div[@]/strong/i/text()').extract_first() item['shop'] = li.xpath('./div/div[@]/span/a/text()').extract_first() item['commit'] = li.xpath('./div/div[@]/strong/a/text()').extract_first() item['shop_id'] = item['link'].split('/')[-1].split('.')[0] # 去掉+号,并把单位 万替换 -> 0000 try: item['commit'] = item['commit'].replace('+', '').replace('万', '0000') except: pass item['img'] = li.xpath('./div/div[@]/a/img/@src').extract_first() yield item # 下一页 if keyword['now_page'] < keyword['max_page']: keyword['now_page'] += 2 new_url = format(self.next_url % (keyword['keyword'], keyword['now_page'], keyword['now_page'] * keyword['page_size'])) yield scrapy.Request(new_url, callback=self.parse, meta={'keyword': keyword}) else: # 下一个关键字 if len(self.keywords) > 0: self.keywords.pop(0) if len(self.keywords) > 0: key = self.keywords[0] yield scrapy.Request(self.url % key['keyword'], callback=self.parse, meta={'keyword': key})
def parse(self, response): # 去掉所有的html标签 print(response.text) # TODO 这里有个问题,就是返回的数据是html,但是返回的数据中又包含了html标签,所以需要去掉 text = response.text.replace('', '').replace('', '') print(text) json_data = json.loads(text) for i in json_data['comments']: print({ 'shop_id': response.meta['id'], 'content': i['content'], 'creationTime': i['creationTime'], 'nickname': i['nickname'], 'score': i['score'], }) item = JdGoodsCommitItem() item['shop_id'] = response.meta['id'] item['content'] = i['content'] item['creationTime'] = i['creationTime'] item['nickname'] = i['nickname'] item['score'] = i['score'] yield item maxPage = json_data['maxPage'] # TODO maxPage > 5 时,强制设置为2,如果你想要全部的评论,可以把这个注释去掉 if maxPage > 2: maxPage = 2 page = response.meta['page'] if page < maxPage: page += 1 yield scrapy.Request(url=self.comment_url.format(page=page, id=response.meta['id']), callback=self.parse, meta={'page': page, 'id': response.meta['id']}) pass
今日头条是中国的一家新闻平台,提供国内外新闻、科技、娱乐、美食等丰富内容,为用户推荐个性化的阅读。它是一家基于算法推荐的信息聚合平台,旨在为用户提供个性化的流媒体信息服务。
可视化,关键字分析,情绪分析
def parse(self, response): # 定位 的div article_lists = response.xpath('//div[@]') video_lists = response.xpath('//div[@]') wtt_lists = response.xpath('//div[@]') # self.parse_article(article_lists) print('文章列表>>>>>>>', len(article_lists)) for list in article_lists: # 的div article = list.xpath('./div/div[@]') link = article.xpath('./a/@href').extract_first() content = article.xpath('./a/text()').extract_first() author = article.xpath('.//div[@]/a/text()').extract_first() author_link = article.xpath('.//div[@]/a/@href').extract_first() item = TouTiaoItem() item['type'] = 'article' item['class_type'] = response.meta['type'] item['link'] = link item['content'] = content item['author'] = author item['author_link'] = author_link yield item print('视频列表>>>>>>>', len(video_lists)) for list in video_lists: # 的div if list.xpath('./div[@]'): video = list.xpath('./div[@]/ul/li') for v in video: link = v.xpath('.//div[@]/div/a/@href').extract_first() content = v.xpath('.//div[@]/div/a/@title').extract_first() author_link = v.xpath('.//div[@]//div[@]/a/@href').extract_first() author = v.xpath('.//div[@]//div[@]/a/text()').extract_first() item = TouTiaoItem() item['type'] = 'video' item['class_type'] = response.meta['type'] item['link'] = link item['content'] = content item['author'] = author item['author_link'] = author_link yield item elif list.xpath('./div[@]'): video = list.xpath('./div[@]') link = video.xpath('./div[@]/div[@]/div[@]/a/@href').extract_first() content = video.xpath('./div[@]/div[@]/div[@]/a/@title').extract_first() author = video.xpath('.//div[@]//div[@]/a/text()').extract_first() author_link = video.xpath('.//div[@]//div[@]/a/@href').extract_first() item = TouTiaoItem() item['type'] = 'video' item['class_type'] = response.meta['type'] item['link'] = link item['content'] = content item['author'] = author item['author_link'] = author_link yield item print('wtt列表>>>>>>>', len(wtt_lists)) for list in wtt_lists: if list.xpath('./div[@]'): wtt = list.xpath('./div[@]') author_link = wtt.xpath('./div[@]//div[@]/a/@href').extract_first() author = wtt.xpath('./div[@]//div[@]/a/@title').extract_first() link = wtt.xpath('./div[@]/p/a/@href').extract_first() content = wtt.xpath('./div[@]/p/a/text()').extract_first() item = TouTiaoItem() item['type'] = 'wtt' item['class_type'] = response.meta['type'] item['link'] = link item['content'] = content item['author'] = author item['author_link'] = author_link yield item elif list.xpath('./div[@]'): wtt = list.xpath('./div[@]') author_link = wtt.xpath('./div[@]//div[@]/a/@href').extract_first() author = wtt.xpath('./div[@]//div[@]/a/@title').extract_first() link = wtt.xpath('./div[@]/p/a/@href').extract_first() content = wtt.xpath('./div[@]/p/a/text()').extract_first() item = TouTiaoItem() item['type'] = 'wtt' item['class_type'] = response.meta['type'] item['link'] = link item['content'] = content item['author'] = author item['author_link'] = author_link yield item pass
如果觉得这篇文章对你有帮助,请一键三连哦~