daliaijdjld

这个实例是获取(某某点津)里每一条文章里的信息https://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代码

打开刚刚创建的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条数据
在这里插入图片描述
有些图有马赛克是因为太严了,望理解
大家有什么问题欢迎留言!

分类:

技术点:

相关文章:

  • 2022-01-23
  • 2021-12-15
  • 2021-12-16
  • 2021-11-30
  • 2021-11-30
  • 2021-11-02
  • 2021-08-04
猜你喜欢
  • 2021-10-21
  • 2021-06-28
  • 2022-12-23
  • 2021-04-01
  • 2020-07-24
  • 2022-12-23
  • 2021-07-29
相关资源
相似解决方案