Scrapy实例1_英语点津

这个实例是获取(英语点津)里每一条文章里的信息http://language.chinadaily.com.cn/thelatest保存为csv文件

分析网页

我们要先分析网页结构,获取每条文章的链接地址,发现这个三个的链接地址是一样,所以获取哪个标签下的链接地址都可以,每一页有15条数据,共有293页
在这里插入图片描述

在这里插入图片描述
然后点击一条链接里去看需要爬取的信息,我们获取文章标题、发布者和时间、文本内容3个信息
在这里插入图片描述

创建scrapy项目

打开pycharm的Terminal,输入scrapy startproject english(scrapy startproject 项目名)
在这里插入图片描述
进入刚刚创建的Scrapy项目目录下 cd english (cd 项目名)

在这里插入图片描述
输入scrapy可以查看操作指令
在这里插入图片描述

创建好了项目之后我们可以看到一个项目文件
在这里插入图片描述

修改settings.py文件

找到ROBOTSTXT_OBEY改为Flase
在这里插入图片描述
找到ITEM_PIPELINES打开注释
在这里插入图片描述

编写spider

创建爬虫文件scrapy genspider english_sp chinadaily.com.cn(scrapy genspider 文件名 域名),爬虫文件会保存在spiders目录下
在这里插入图片描述

编写爬虫代码

打开刚刚创建的english_sp.py文件
修改start_urls

# 我们需要获取293页数据
start_urls = ['http://language.chinadaily.com.cn/thelatest/page_{}.html'.format(page) for page in range(1, 294)]   

编写parse方法

	def parse(self, response):
	   # 使用xpath获取每个新闻的url地址
	   urls = response.xpath('//a[@class="gy_box_img"]/@href')  
	   for url in urls:   # 遍历获取到的url
	       data_url = url.get().replace('//', 'http://')
	       # 把获取的url地址去发送新的请求,响应数据给到parse_text方法去解析
	       yield scrapy.Request(url=data_url, callback=self.parse_text)

编写parse_text方法

    def parse_text(self, response):
        """
        数据解析
        :param response: 网页响应内容
        """
        # 标题
        title = response.xpath('//div[@class="main_title"]/h1/span[@class="main_title1"]/text()').get()
        # 作者和时间
        are = response.xpath('normalize-space(//div[@class="main_title"]/p[@class="main_title3"]/text())').get()
        # 获取指定div标签下的所有p标签的文本信息, 注意返回的是每个p标签信息的列表
        text = response.xpath('//div[@class="mian_txt"]/p//text()').getall()
        # 文章内容
        text_all = ''
        # 将列表中所有的内容合并,并去除\xa0
        for strs in text_all:
            if strs != '\xa0':
                text += strs
        item = EnglishItem(title=title, are=are, text=text)
        yield item

english_sp.py完整代码如下

import scrapy
from ..items import EnglishItem


class EnglishSpSpider(scrapy.Spider):
    name = 'english_sp'
    allowed_domains = ['chinadaily.com.cn']  # 限制域名
    # 我们需要获取293页数据
    start_urls = ['http://language.chinadaily.com.cn/thelatest/page_{}.html'.format(page) for page in range(1, 294)]

    def parse(self, response):
        # 使用xpath获取每个新闻的url地址
        urls = response.xpath('//a[@class="gy_box_img"]/@href')
        for url in urls:  # 遍历获取到的url
            data_url = url.get().replace('//', 'http://')
            # 把获取的url地址去发送新的请求,响应数据给到parse_text方法去解析
            yield scrapy.Request(url=data_url, callback=self.parse_text)

    def parse_text(self, response):
        """
        数据解析
        :param response: 网页响应内容
        """
        # 标题
        title = response.xpath('//div[@class="main_title"]/h1/span[@class="main_title1"]/text()').get()
        # 作者和时间
        are = response.xpath('normalize-space(//div[@class="main_title"]/p[@class="main_title3"]/text())').get()
        # 获取指定div标签下的所有p标签的文本信息, 注意返回的是每个p标签信息的列表
        text = response.xpath('//div[@class="mian_txt"]/p//text()').getall()
        # 文章内容
        text_all = ''
        # 将列表中所有的内容合并,并去除\xa0
        for strs in text_all:
            if strs != '\xa0':
                text += strs
        item = EnglishItem(title=title, are=are, text=text)
        yield item

编写items.py

import scrapy


class EnglishItem(scrapy.Item):  # 数据管道
    title = scrapy.Field()
    are = scrapy.Field()
    text = scrapy.Field()

编写pipelines.py

import csv


class EnglishPipeline:
    def __init__(self):
        self.f = open('data.csv', mode='a', encoding='utf-8', newline='')
        self.csv_write = csv.DictWriter(self.f, fieldnames=['title', 'are', 'text'])
        self.csv_write.writeheader()

    def process_item(self, item, spider):
        self.csv_write.writerow(dict(item))
        return item

    def close_file(self):
        self.f.close()

运行Scrapy项目

回到Terminal输入scrapy crawl english_sp(scrapy crawl 爬虫文件名称)
在这里插入图片描述
大约3分钟后爬取完毕(爬取速度和电脑性能、网页响应速度有关,也可以自己修改settings.py文件配置提高爬取速度)
在这里插入图片描述

项目文件目录下会出现data.csv文件
在这里插入图片描述
大约有4393条数据
在这里插入图片描述
有些图有马赛克是因为太严了,望理解
大家有什么问题欢迎留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值