jquery教程

推荐列表 站点导航

当前位置:首页 > jquery > jquery教程 >

scrapy在python爬虫中抓取符号出错怎么办?

来源:网络整理  作者:  发布时间:2020-12-22 02:14
jquery中文网为您提供scrapy在python爬虫中抓取符号出错怎么办?等资源,欢迎您收藏本站,我们将为您提供最新的scra...

scrapy在python爬虫中抓取符号出错怎么办?

因为抓取到的Twitter上有表情等特殊符号,在插入数据库时会报错,所以,这里需要对抓取的内容信息进行清洗。

TweetScraper/utils.py 文件新增filter_emoji过滤方法

这几个月经常能有Twitter的言论被大家知道,这还要得益于美国某个滑稽而又喜欢表演的人,这里小编就不说是谁了。抛去这点不谈,Twitter上的言论交流还是很有趣的。想要了解上面的言论可以用python进行采集,但是很多人都有发表情符号之类的习惯,这就给我们获取数据带来了困难,下面吗大家一起看看该如何解决。

from TweetScraper.utils import filter_emoji   def parse_tweet_item(self, items):         for item in items:             try:                 tweet = Tweet()                   tweet['usernameTweet'] = item.xpath('.//span[@class="username u-dir u-textTruncate"]/b/text()').extract()[0]                   ID = item.xpath('.//@data-tweet-id').extract()                 if not ID:                     continue                 tweet['ID'] = ID[0]                   ### get text content                 tweet['text'] = ' '.join(                     item.xpath('.//div[@class="js-tweet-text-container"]/p//text()').extract()).replace(' # ',                                                                                                         '#').replace(                     ' @ ', '@')                   ### clear data[20200416]                 # tweet['text'] = re.sub(r"[\s \.\!\/_,$%^*( \"\')] |[ ——?【】?~@#¥%……&*] |\\n |\\r |(\\xa0) |(\\u3000) |\\t", "", tweet['text']);                                                                  # 过滤掉表情符号【20200417】                 tweet['text'] = filter_emoji(tweet['text'], '')                   if tweet['text'] == '':                     # If there is not text, we ignore the tweet                     continue                   ### get meta data                 tweet['url'] = item.xpath('.//@data-permalink-path').extract()[0]                   nbr_retweet = item.css('span.ProfileTweet-action--retweet > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_retweet:                     tweet['nbr_retweet'] = int(nbr_retweet[0])                 else:                     tweet['nbr_retweet'] = 0                   nbr_favorite = item.css('span.ProfileTweet-action--favorite > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_favorite:                     tweet['nbr_favorite'] = int(nbr_favorite[0])                 else:                     tweet['nbr_favorite'] = 0                   nbr_reply = item.css('span.ProfileTweet-action--reply > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_reply:                     tweet['nbr_reply'] = int(nbr_reply[0])                 else:                     tweet['nbr_reply'] = 0                   tweet['datetime'] = datetime.fromtimestamp(int(                     item.xpath('.//div[@class="stream-item-header"]/small[@class="time"]/a/span/@data-time').extract()[                         0])).strftime('%Y-%m-%d %H:%M:%S')                   ### get photo                 has_cards = item.xpath('.//@data-card-type').extract()                 if has_cards and has_cards[0] == 'photo':                     tweet['has_image'] = True                     tweet['images'] = item.xpath('.//*/div/@data-image-url').extract()                 elif has_cards:                     logger.debug('Not handle "data-card-type":\n%s' % item.xpath('.').extract()[0])                   ### get animated_gif                 has_cards = item.xpath('.//@data-card2-type').extract()                 if has_cards:                     if has_cards[0] == 'animated_gif':                         tweet['has_video'] = True                         tweet['videos'] = item.xpath('.//*/source/@video-src').extract()                     elif has_cards[0] == 'player':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'summary_large_image':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'amplify':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'summary':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == '__entity_video':                         pass  # TODO                         # tweet['has_media'] = True                         # tweet['medias'] = item.xpath('.//*/div/@data-src').extract()                     else:  # there are many other types of card2 !!!!                         logger.debug('Not handle "data-card2-type":\n%s' % item.xpath('.').extract()[0])                   is_reply = item.xpath('.//div[@class="ReplyingToContextBelowAuthor"]').extract()                 tweet['is_reply'] = is_reply != []                   is_retweet = item.xpath('.//span[@class="js-retweet-text"]').extract()                 tweet['is_retweet'] = is_retweet != []                   tweet['user_id'] = item.xpath('.//@data-user-id').extract()[0]                 yield tweet                   if self.crawl_user:                     ### get user info                     user = User()                     user['ID'] = tweet['user_id']                     user['name'] = item.xpath('.//@data-name').extract()[0]                     user['screen_name'] = item.xpath('.//@data-screen-name').extract()[0]                     user['avatar'] = \                         item.xpath('.//div[@class="content"]/div[@class="stream-item-header"]/a/img/@src').extract()[0]                     yield user             except:                 logger.error("Error tweet:\n%s" % item.xpath('.').extract()[0])                 # raise

通过数据清洗,现在可以正常插入到表里了。

import re   def filter_emoji(desstr, restr=''):     """     filter emoji     desstr: origin str     restr: replace str     """     # filter emoji     try:         res = re.compile(u'[\U00010000-\U0010ffff]')     except re.error:         res = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') return res.sub(restr, desstr)

 


代码部分略微复杂,想要收集Twitter上的交流谈话也不是件轻松的事情,不过像提前查看结果的小伙伴,可以直接复制代码运行~更多Python学习推荐:JQ教程网Python大全

在 TweetCrawler.py 文件中调用该方法:


相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jq/jc/6908.shtml

相关文章
最新文章
PHP识别相片是否是颠倒的 PHP识别相片是否是颠倒的

时间:2020-12-28

python编程有哪些ide python编程有哪些ide

时间:2020-12-28

python开发工程师是做什么 python开发工程师是做什么

时间:2020-12-28

php构造函数的作用 php构造函数的作用

时间:2020-12-28

php怎么跟数据库连接 php怎么跟数据库连接

时间:2020-12-28

php实现顺序线性表 php实现顺序线性表

时间:2020-12-28

Python多重继承中的菱形继 Python多重继承中的菱形继

时间:2020-12-28

php中break的作用 php中break的作用

时间:2020-12-28

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

scrapy在python爬虫中抓取符号出错怎么办?

2020-12-22 编辑:

scrapy在python爬虫中抓取符号出错怎么办?

因为抓取到的Twitter上有表情等特殊符号,在插入数据库时会报错,所以,这里需要对抓取的内容信息进行清洗。

TweetScraper/utils.py 文件新增filter_emoji过滤方法

这几个月经常能有Twitter的言论被大家知道,这还要得益于美国某个滑稽而又喜欢表演的人,这里小编就不说是谁了。抛去这点不谈,Twitter上的言论交流还是很有趣的。想要了解上面的言论可以用python进行采集,但是很多人都有发表情符号之类的习惯,这就给我们获取数据带来了困难,下面吗大家一起看看该如何解决。

from TweetScraper.utils import filter_emoji   def parse_tweet_item(self, items):         for item in items:             try:                 tweet = Tweet()                   tweet['usernameTweet'] = item.xpath('.//span[@class="username u-dir u-textTruncate"]/b/text()').extract()[0]                   ID = item.xpath('.//@data-tweet-id').extract()                 if not ID:                     continue                 tweet['ID'] = ID[0]                   ### get text content                 tweet['text'] = ' '.join(                     item.xpath('.//div[@class="js-tweet-text-container"]/p//text()').extract()).replace(' # ',                                                                                                         '#').replace(                     ' @ ', '@')                   ### clear data[20200416]                 # tweet['text'] = re.sub(r"[\s \.\!\/_,$%^*( \"\')] |[ ——?【】?~@#¥%……&*] |\\n |\\r |(\\xa0) |(\\u3000) |\\t", "", tweet['text']);                                                                  # 过滤掉表情符号【20200417】                 tweet['text'] = filter_emoji(tweet['text'], '')                   if tweet['text'] == '':                     # If there is not text, we ignore the tweet                     continue                   ### get meta data                 tweet['url'] = item.xpath('.//@data-permalink-path').extract()[0]                   nbr_retweet = item.css('span.ProfileTweet-action--retweet > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_retweet:                     tweet['nbr_retweet'] = int(nbr_retweet[0])                 else:                     tweet['nbr_retweet'] = 0                   nbr_favorite = item.css('span.ProfileTweet-action--favorite > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_favorite:                     tweet['nbr_favorite'] = int(nbr_favorite[0])                 else:                     tweet['nbr_favorite'] = 0                   nbr_reply = item.css('span.ProfileTweet-action--reply > span.ProfileTweet-actionCount').xpath(                     '@data-tweet-stat-count').extract()                 if nbr_reply:                     tweet['nbr_reply'] = int(nbr_reply[0])                 else:                     tweet['nbr_reply'] = 0                   tweet['datetime'] = datetime.fromtimestamp(int(                     item.xpath('.//div[@class="stream-item-header"]/small[@class="time"]/a/span/@data-time').extract()[                         0])).strftime('%Y-%m-%d %H:%M:%S')                   ### get photo                 has_cards = item.xpath('.//@data-card-type').extract()                 if has_cards and has_cards[0] == 'photo':                     tweet['has_image'] = True                     tweet['images'] = item.xpath('.//*/div/@data-image-url').extract()                 elif has_cards:                     logger.debug('Not handle "data-card-type":\n%s' % item.xpath('.').extract()[0])                   ### get animated_gif                 has_cards = item.xpath('.//@data-card2-type').extract()                 if has_cards:                     if has_cards[0] == 'animated_gif':                         tweet['has_video'] = True                         tweet['videos'] = item.xpath('.//*/source/@video-src').extract()                     elif has_cards[0] == 'player':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'summary_large_image':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'amplify':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == 'summary':                         tweet['has_media'] = True                         tweet['medias'] = item.xpath('.//*/div/@data-card-url').extract()                     elif has_cards[0] == '__entity_video':                         pass  # TODO                         # tweet['has_media'] = True                         # tweet['medias'] = item.xpath('.//*/div/@data-src').extract()                     else:  # there are many other types of card2 !!!!                         logger.debug('Not handle "data-card2-type":\n%s' % item.xpath('.').extract()[0])                   is_reply = item.xpath('.//div[@class="ReplyingToContextBelowAuthor"]').extract()                 tweet['is_reply'] = is_reply != []                   is_retweet = item.xpath('.//span[@class="js-retweet-text"]').extract()                 tweet['is_retweet'] = is_retweet != []                   tweet['user_id'] = item.xpath('.//@data-user-id').extract()[0]                 yield tweet                   if self.crawl_user:                     ### get user info                     user = User()                     user['ID'] = tweet['user_id']                     user['name'] = item.xpath('.//@data-name').extract()[0]                     user['screen_name'] = item.xpath('.//@data-screen-name').extract()[0]                     user['avatar'] = \                         item.xpath('.//div[@class="content"]/div[@class="stream-item-header"]/a/img/@src').extract()[0]                     yield user             except:                 logger.error("Error tweet:\n%s" % item.xpath('.').extract()[0])                 # raise

通过数据清洗,现在可以正常插入到表里了。

import re   def filter_emoji(desstr, restr=''):     """     filter emoji     desstr: origin str     restr: replace str     """     # filter emoji     try:         res = re.compile(u'[\U00010000-\U0010ffff]')     except re.error:         res = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') return res.sub(restr, desstr)

 


代码部分略微复杂,想要收集Twitter上的交流谈话也不是件轻松的事情,不过像提前查看结果的小伙伴,可以直接复制代码运行~更多Python学习推荐:JQ教程网Python大全

在 TweetCrawler.py 文件中调用该方法:


本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jq/jc/6908.shtml

相关文章

风云图片

推荐阅读

返回jquery教程频道首页