WEB程序员笔记

一个前端开发工程师的个人博客

动手Web爬取:使用python和scrapy构建自己的Twitter数据集

我明白了–您已经厌倦了为自己的机器学习项目或分析流行的Twitter趋势而在线搜索数据集。

今天,我们将学习如何使用标签搜索从Twitter生成您自己的自定义数据集。

想要跳过该帖子并直接查看好东西吗?这是适合您的Github存储库

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》 amitupreti 动手网上抓取

此回购协议是几个Web抓取项目上的博客系列的一部分,我们将探索抓取技术,以使用高级保护将数据从简单网站爬网到网站。


了解机器人的Twitter政策

首先,请确保我们遵循twitter.com制定的政策,以便机器人在爬网时遵循该政策,以免遇到任何法律问题。让我们去https://twitter.com/robots.txt

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

我们可以看到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加载数据,这使我们的工作变得非常容易。

我选择一个懒惰的人去努力。因为一个懒惰的人会找到一种简单的方法来做到这一点。

– 比尔盖茨

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

查找我们的主题标签搜索的所有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如果每个爬网都可用,我们的爬虫将继续递归地单击该按钮。这意味着我们将一页一页地访问所有结果页面。

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

从单个推文中查找所有数据— * 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。


现在让我们进行示例爬网。

首先,让我们设置搜寻器

安装

  1. 下载项目(适用于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
  1. 安装依赖项
pip install -r requirements.txt --user
  1. 验证爬虫蜘蛛是否存在
scrapy list

如果看到twittercrawler,则表示一切就绪。

使用主题标签

打开myhashtags.csv文件,然后将您的主题标签用新行分隔

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

抓取并保存所需格式的数据(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

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

现在,您应该看到数据已保存为具有您选择的格式的输出文件

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

加快爬网速度

如果您觉得搜寻器有点慢hashtag.py,请在项目中找到文件并编辑自定义设置。

《动手Web爬取:使用python和scrapy构建自己的Twitter数据集》

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)。

如果您有建议或发现一些问题。

可以在GitHub上随意发布问题请求请求

感谢您的阅读。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注