scrapy+selenium爬取五个外国新闻网站关于“中国“的新闻,并分析

1.题目

爬取一下5家的加拿大新闻网站包含“China” /
"Chinese"的数据,时间范围为2020年1月日至今,分析每家媒体文章的词云图、情感趋势图等。
https://www.cbc.ca/
https://nationalpost.com/
https://www.thestar.com/?redirect=true
https://www.ctvnews.ca/
https://globalnews.ca/national/

2.scrapy+selenium爬取动态网站

以CBC网站爬取为例,spider编写如下

import scrapy
from ..items import CbcItem
from selenium import webdriver
from selenium.webdriver import FirefoxOptions
from threading import Thread, Lock
class ChinaSpider(scrapy.Spider):
    name = 'china'
    allowed_domains = ['https://www.cbc.ca/']
    start_urls = ['https://www.cbc.ca/search?q=china&section=news']

    def __init__(self):
        # 在初始化时,创建driver
        super(ChinaSpider, self).__init__(name='china')
        option = FirefoxOptions()
        option.headless = True
        self.driver = webdriver.Firefox(options=option)

    def parse(self, response):
        tr_list = response.xpath("//div[@class='contentListCards']/a")
        for tr in tr_list:
            item = CbcItem()
            href = tr.xpath("./@href").extract_first()
            time = tr.xpath(
                    "./div/div/div[@class='card-content-bottom']/div/div/time/@datetime").extract_first()
            year = time[:4]
            month = time[5:7]
            print(year+month)
            if int(month) >=1 and int(year) == 2020:
                if (href[1:5] == 'news'):
                    item["title"] = tr.xpath("./div/div/div[@class='card-content-top']/h3/text()").extract_first()
                    item["brief"] = tr.xpath(
                        "./div/div/div[@class='card-content-top']/div[@id='d-card-']/text()").extract_first()
                    item['herf'] = 'https://www.cbc.ca' + href
                    item['publish_date'] = tr.xpath(
                        "./div/div/div[@class='card-content-bottom']/div/div/time/@datetime").extract_first()
                   # 详情页爬取
                    yield scrapy.Request(
                        item['herf'],
                        callback=self.parse_detail,
                        meta={"item": item},
                        dont_filter=True
                    )
           
    def parse_detail(self, response):
        item = response.meta['item']
        item["content"] = response.xpath("//div[@class='story']/span/p/text()").extract()
        item["content"] = "".join(item["content"])
        print(item)
        yield(item)

在middlewares中编写自己的Download方法,并在setting中修改
主要是完成浏览器对js页面的解析

            if spider.name == "china":
                spider.driver.get(request.url)
                # CBc爬虫的初始页面不断点击
                if (request.url == "https://www.cbc.ca/search?q=china&section=news"):
                    print("我只运行了一次")
                    for i in range(70):
                        button = spider.driver.find_element_by_xpath(
                            "//*[@id='content']/div/div[4]/section/div[1]/div[2]/div/button")
                        spider.driver.execute_script("arguments[0].click();", button)
                        print("我已经点击了%d" % i)
                        time.sleep(2)

                # 由于页面数据加载需要进行滚动,但并不是所有js动态数据都需要滚动。
                for x in range(1, 11, 2):
                    height = float(x) / 10
                    js = "document.documentElement.scrollTop = document.documentElement.scrollHeight * %f" % height
                    spider.driver.execute_script(js)
                    time.sleep(0.2)
                origin_code = spider.driver.page_source
                # 将源代码构造成为一个Response对象,并返回。
                res = HtmlResponse(url=request.url, encoding='utf8', body=origin_code, request=request)
                # res = Response(url=request.url, body=bytes(origin_code), request=request)
                return res

3.最终结果

3.1数据
在这里插入图片描述
3.2简单分析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意
1.用梯子
2.解析js页面很慢
3.需要占用本地资源,最好使用服务器,可以使用分布式

4.下载

链接:https://pan.baidu.com/s/1iJoEo8JoUPsz6aJE4de12A
提取码:cua9

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值