我明白了–您已经厌倦了为自己的机器学习项目或分析流行的Twitter趋势而在线搜索数据集。
今天,我们将学习如何使用标签搜索从Twitter生成您自己的自定义数据集。
想要跳过该帖子并直接查看好东西吗?这是适合您的Github存储库
amitupreti / 动手网上抓取
此回购协议是几个Web抓取项目上的博客系列的一部分,我们将探索抓取技术,以使用高级保护将数据从简单网站爬网到网站。
了解机器人的Twitter政策
首先,请确保我们遵循twitter.com制定的政策,以便机器人在爬网时遵循该政策,以免遇到任何法律问题。让我们去https://twitter.com/robots.txt
我们可以看到twitter允许所有机器人(请参阅User-agent行)使用主题标签搜索(请参见Allow:/ hashtag…行),并请求在两者之间进行1秒钟的延迟(请参见Crawl-delay行)。搜寻要求。
User-agent: *
Allow: /hashtag/*?src=
Crawl-delay: 1
遍历代码
假设您具有python和scrapy的一些基本知识。如果仅对生成自己的数据集感兴趣,请跳过本部分,直接转到示例爬网部分,或访问GitHub repo。
通过搜索标签收集推文URL
为了搜索推文,我们将使用旧版推特网站。让我们尝试搜索#cat https://mobile.twitter.com/hashtag/cats。这个旧版本不使用javascript加载数据,这使我们的工作变得非常容易。
我选择一个懒惰的人去努力。因为一个懒惰的人会找到一种简单的方法来做到这一点。
– 比尔盖茨
查找我们的主题标签搜索的所有tweet URL — find_tweets()函数
如果您想一次查看完整的代码。这是Github仓库。
def find_tweets(self, response):
tweets = response.xpath('//table[@class="tweet "]/@href').getall()
logging.info(f'{len(tweets)} tweets found')
for tweet_id in tweets:
tweet_id = re.findall("\d+", tweet_id)[-1]
tweet_url = 'https://twitter.com/anyuser/status/' + \
str(tweet_id)
yield scrapy.Request(tweet_url, callback=self.parse_tweet)
# finding and visiting next page
next_page = response.xpath(
'//*[@class="w-button-more"]/a/@href').get(default='')
logging.info('Next page found:')
if next_page != '':
next_page = 'https://mobile.twitter.com' + next_page
yield scrapy.Request(next_page, callback=self.find_tweets)
说明:我们将在当前页面中找到所有tweets URL的xpath,然后对这些URL进行爬网并将响应发送给我们的2nd函数parse_tweet ()
现在,我们将找到Load older Tweets
按钮的下一个URL 并对其进行爬网,并将响应发送到当前find_tweets()
函数。这样,Load older Tweet
如果每个爬网都可用,我们的爬虫将继续递归地单击该按钮。这意味着我们将一页一页地访问所有结果页面。
从单个推文中查找所有数据— * parse_tweet()函数 *
def parse_tweet(self, response):
logging.info('Processing --> ' + response.url)
username = response.xpath(
'//*[@class="permalink-inner permalink-tweet-container"]//*[@class="username u-dir u-textTruncate"]/b/text()').get(
default='')
full_name = response.xpath(
'//*[@class="permalink-inner permalink-tweet-container"]//*[@class="FullNameGroup"]/strong/text()').get(
default='')
tweet_text = ' '.join(response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[@class="js-tweet-text-container"]/p//text()').getall()).strip()
image_list = response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[@class="AdaptiveMediaOuterContainer"]//img/@src').getall()
date_time = response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[@class="js-tweet-details-fixer tweet-details-fixer"]/div[@class="client-and-actions"]/span[@class="metadata"]/span/text()').get(
default='')
date_time = parser.parse(date_time.replace('-', '')).strftime('%Y-%m-%d %H:%M:%S')
retweets = response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[@class="js-tweet-details-fixer tweet-details-fixer"]/div[@class="js-tweet-stats-container tweet-stats-container"]//*[@class="js-stat-count js-stat-retweets stat-count"]/a/strong/text()').get(
default='')
likes = response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[@class="js-tweet-details-fixer tweet-details-fixer"]/div[@class="js-tweet-stats-container tweet-stats-container"]//*[@class="js-stat-count js-stat-favorites stat-count"]/a/strong/text()').get(
default='')
replies = response.xpath(
'//*[contains(@class,"permalink-inner permalink-tweet-container")]//*[contains(@id,"profile-tweet-action-reply-count")]/parent::span/@data-tweet-stat-count').get(
default='')
mentions = get_mentions(tweet_text)
hashtags = get_hashtags(tweet_text)
cta = get_links(tweet_text)
result = {
'username': username.lower(),
'full_name': full_name,
'twitter_url': response.url,
'tweet_text': tweet_text,
'tweet_time': str(date_time),
'number_of_likes': str(likes),
'no_of_retweets': str(retweets),
'no_of_replies': str(replies),
'mentions': ' | '.join(mentions),
'no_of_mentions': str(len(mentions)),
'hashtags': ' | '.join(hashtags),
'no_of_hashtags': str(len(hashtags)),
'call_to_action': ' | '.join(cta),
'image_url': ' | '.join(image_list),
}
yield result
print(result)
说明:在这里,我们将使用Twitter的当前版本(例如:https : //twitter.com/catsfootprint/status/1213603795663491010 75),因为它可以加载所有数据,甚至无需渲染javascript。
现在让我们进行示例爬网。
首先,让我们设置搜寻器
安装
- 下载项目(适用于OS X和Linux)
git clone https://github.com/amitupreti/Hands-on-WebScraping
cd Hands-on-WebScraping/project1_twitter_hashtag_crawler
对于Windows用户
- 在此处下载项目(Windows)。
- —提取项目
- —打开cmd并在项目目录中导航
cd Hands-on-WebScraping/project1_twitter_hashtag_crawler
- 安装依赖项
pip install -r requirements.txt --user
- 验证爬虫蜘蛛是否存在
scrapy list
如果看到twittercrawler
,则表示一切就绪。
使用主题标签
打开myhashtags.csv
文件,然后将您的主题标签用新行分隔
抓取并保存所需格式的数据(JSON,JSON行,CSV,XML)
对于CSV
scrapy crawl twittercrawler -a filename=myhashtags.csv -o mydata.csv
对于JSON
scrapy crawl twittercrawler -a filename=myhashtags.csv -o mydata.json
对于杰森斯
scrapy crawl twittercrawler -a filename=myhashtags.csv -o mydata.jl
对于XML
scrapy crawl twittercrawler -a filename=myhashtags.csv -o mydata.xml
现在,您应该看到数据已保存为具有您选择的格式的输出文件
加快爬网速度
如果您觉得搜寻器有点慢hashtag.py
,请在项目中找到文件并编辑自定义设置。
custom_settings = {
'USER_AGENT': 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Safari/537.36',
'CONCURRENT_REQUESTS': 2, 'DOWNLOAD_DELAY': 1, 'LOG_LEVEL': 'INFO'}
这CONCURRENT_REQUESTS
是将被并行处理的URL数量,并且DOWNLOAD_DELAY
是每个请求之间的等待时间。因此,增加CONCURRENT_REQUESTS
和减少DOWNLOAD_DELAY
(下载延迟的最小值为0)。
如果您有建议或发现一些问题。
感谢您的阅读。