scrapy爬虫爬取多网页内容

这篇具有很好参考价值的文章主要介绍了scrapy爬虫爬取多网页内容。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:此案例是爬取目标网站(https://tipdm.com/)的新闻中心板块的公司新闻中所有新闻的标题、发布时间、访问量和新闻的文本内容。

1. 创建scrapy项目

我使用的是 Anaconda prompt
我们使用如下命令创建scrapy项目:scrapy startproject spider_name 爬虫路径

spider_name是项目的名字
爬虫路径就是项目所在位置

本案例内命令是:scrapy startproject mySpider 路径

2. 生成爬虫器

我们先生成 spider(爬虫器) 文件:scrapy genspider spider_name domain

  1. spider_name:是生成的 爬虫器的名字,在目录spiders 下面
  2. domain:是要爬取的网站的域名(一般是不加http,只写www.xxx.com就行)

本案例内,命令是scrapy genspider msd www.tipdm.com

3. 指定爬取字段(items.py)

指定要爬取的内容都有什么,我们在摘要中已经说明,要爬取的是 所有新闻的标题、发布时间、访问量和新闻的文本内容
所以有四个字段,代码如下:

import scrapy

class MyspiderItem(scrapy.Item):
    title = scrapy.Field()
    time = scrapy.Field()
    view = scrapy.Field()
    text = scrapy.Field()

4. 编写爬虫文件(msd.py)

我们要爬取的是:所有页面的、所有新闻的内容。
所以我们写三个parse函数。

  1. parse:得到页数,并得到每页的网址,传给下个函数
  2. parse_url:得到每个页面的所有新闻的链接
  3. parse_text:分析得到的新闻界面的内容,并存入 item 中,返回回去

注意:将 start_url 修改成第一个要爬取的页面,即公司新闻的页面

(代码中注释掉的内容都是调试用的)

parse函数

先得到总页数,因为取出来的是 str,将其转成int类型。
通过取出各个页面可知,每个页面的网址类似,只有数字不同,我们就可以生成网址了。
然后使用 yield Request() 回调下一个函数。
现在还不太懂原理。yield ,并不会直接返回,而是会返回一个生成器,可以遍历完所有的网页再统一返回

    def parse(self, response):
        number = int(response.xpath('//*[@id="t251"]/div[6]/div/a[6]/text()').extract()[0]) # 总页数
        url_all = ['http://www.tipdm.com/gsxw/index_{}.jhtml'.format(i) for i in range(1, number + 1)]
        
        for i in url_all:
            yield Request(url=i, callback=self.parse_url, dont_filter=True)

parse_url

得到单个页面中的所有新闻的网址,放在一个列表中
注意:这里被卡了好久,就是因为得到的网址是不完整的,没有前缀(http之类的)一直进不到下一个函数(可以在每个函数写一个输出语句,以便检查是否进入了函数)
所以我们将url补充完毕,进行回调
爬取不出来的时候,一定要输出一下网址看看

    def parse_url(self, response):
        urls = response.xpath('//*[@id="t251"]/div/div[3]/h1/a/@href').extract()
        for i in urls:
            yield Request(url=('http://www.tipdm.com' + i), callback=self.parse_text, dont_filter=True)

parse_text

本函数是分析新闻的内容的函数,并存储在item中返回
有个很尴尬的点是这个网站的前端有点乱,有几条新闻的文本内容的xpath路径和其他的都不一样,好麻烦的,现在还不知道怎么解决

    def parse_text(self, response):
        item = MyspiderItem()
        item['title'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/h1/text()').extract()  # title
        item['time'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/div/div[1]/span[1]/text()').extract()  # time
        item['view'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/div/div[1]/span[3]/text()').extract()  # view
        item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/p/text()').extract())
        if item['text'] == '':
            item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/p/span/text()').extract())
            if item['text'] == '':
                item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/section[2]/section/section[2]/section[2]/p/span/text()').extract())
        return item

完整代码

import scrapy
from scrapy.http import Request
from mySpider.items import MyspiderItem


class MsdSpider(scrapy.Spider):
    name = 'msd'
    allowed_domains = ['www.tipdm.com']
    start_urls = ['http://www.tipdm.com/gsxw/index.jhtml']

    def parse(self, response):
        number = int(response.xpath('//*[@id="t251"]/div[6]/div/a[6]/text()').extract()[0]) # 总页数
        url_all = ['http://www.tipdm.com/gsxw/index_{}.jhtml'.format(i) for i in range(1, number + 1)]

        for i in url_all:
            # print('1111111111111111')
            yield Request(url=i, callback=self.parse_url, dont_filter=True)
            # print(i)

    def parse_url(self, response):
        urls = response.xpath('//*[@id="t251"]/div/div[3]/h1/a/@href').extract()
        # print('22222222222222222222')
        for i in urls:
            yield Request(url=('http://www.tipdm.com' + i), callback=self.parse_text, dont_filter=True)

    def parse_text(self, response):
        # print('77')
        item = MyspiderItem()
        # print('78')
        item['title'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/h1/text()').extract()  # title
        # print('7999')
        item['time'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/div/div[1]/span[1]/text()').extract()  # time
        item['view'] = response.xpath('/html/body/div[2]/div/div[1]/div[2]/div/div[1]/span[3]/text()').extract()  # view
        item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/p/text()').extract())
        if item['text'] == '':
            item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/p/span/text()').extract())
            if item['text'] == '':
                item['text'] = '\n'.join(response.xpath('/html/body/div[2]/div/div[2]/section[2]/section/section[2]/section[2]/p/span/text()').extract())
        # print('79')
        return item

5. 存储数据(pipelines.py、settings.py)

我们选择使用pipelines存储,需要在settings文件中取消相应代码注释

settings.py

ITEM_PIPELINES = {
   'mySpider.pipelines.MyspiderPipeline': 300,
}

pipelines.py

因为我选择存储为.csv文件,所以需要导入pandas
注意to_csv中,参数顺序不能乱

其中,参数的顺序如下:文章来源地址https://www.toymoban.com/news/detail-419818.html

  1. filename: 文件名,必需。
  2. index: 是否写入行索引,可选。默认为False
  3. encoding: 字符编码,可选。默认为utf-8-sig
  4. compression: 压缩模式,可选。默认为gzip
  5. header: 表头是否写入,可选。默认为None
  6. footer: 表尾是否写入,可选。默认为None
  7. newline: 换行符,可选。默认为None
  8. dtype: 数据类型,可选。默认为None
  9. optimizer: 优化器,可选。默认为None
  10. 写入文件的写入器对象: 写入文件的写入器对象,可选。默认为None
  11. 写入文件的参数: 写入文件的参数,可选。默认为None
    需要注意的是,headerfooter参数默认为None,表示不写入表头和表尾。如果希望写入表头或表尾,可以设置该参数为True
import pandas as pd
from itemadapter import ItemAdapter

class MyspiderPipeline:
    def process_item(self, item, spider):
        data = pd.DataFrame(dict(item))
        data.to_csv('data2.csv', mode='a+', index=None, encoding='utf-8-sig', header=None)
        return item

到了这里,关于scrapy爬虫爬取多网页内容的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络爬虫丨基于scrapy+mysql爬取博客信息

    本期内容 :基于scrapy+mysql爬取博客信息并保存到数据库中 实验需求 anaconda丨pycharm python3.11.4 scrapy mysql 项目下载地址:https://download.csdn.net/download/m0_68111267/88740730 本次实验实现了:使用Scrapy框架爬取博客专栏的目录信息并保存到MySQL数据库中,实验主要涉及到Python的爬虫技术以

    2024年03月18日
    浏览(56)
  • 爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)

      1.终端运行scrapy startproject movie,创建项目 2.接口查找  3.终端cd到spiders,cd scrapy_carhome/scrapy_movie/spiders,运行 scrapy genspider mv https://dy2018.com/ 4.打开mv,编写代码,爬取电影名和网址 5.用爬取的网址请求,使用meta属性传递name ,callback调用自定义的parse_second 6.导入ScrapyMovieItem,将movie对象

    2024年02月19日
    浏览(53)
  • Python爬虫之Scrapy框架系列(23)——分布式爬虫scrapy_redis浅实战【XXTop250部分爬取】

    先用单独一个项目来使用scrapy_redis,讲解一些重要点!

    2024年02月16日
    浏览(55)
  • scrapy框架简单实现豆瓣评分爬取案例

    豆瓣网址:https://movie.douban.com/top250 在spiders目录下创建一个spider_one.py文件,可以随意命名,该文件主要是让我们进行数据爬取的。 运行命令: 注意末尾的域名是用来设置爬取的范围的 spider_one.py代码如下 放开useragent,配置好对应的值 关闭robots协议 放开管道限制 在items.py文

    2024年02月14日
    浏览(32)
  • 使用PyCharm编写Scrapy爬虫程序,爬取古诗词网站

    本次测试案例参考厦门大学数据库实验室 链接: https://dblab.xmu.edu.cn/blog/3937/ 在PyCharm中新建一个名称为“scrapyProject”的工程,如下图所示,Python解释器就选择我们之前已经安装好的 本次测试环境为 Python3.7.6 在“scrapyProject”工程底部打开Terminal窗口(如下图所示),在命令提示

    2024年02月11日
    浏览(46)
  • 网络爬虫丨基于scrapy+mysql爬取博客信息并保存到数据库中

    本期内容 :基于scrapy+mysql爬取博客信息并保存到数据库中 实验需求 anaconda丨pycharm python3.11.4 scrapy mysql 项目下载地址:https://download.csdn.net/download/m0_68111267/88740730 本次实验实现了:使用Scrapy框架爬取博客专栏的目录信息并保存到MySQL数据库中,实验主要涉及到Python的爬虫技术以

    2024年01月17日
    浏览(46)
  • Scrapy爬虫框架集成Selenium来解析动态网页

    当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资

    2024年02月15日
    浏览(53)
  • 爬虫学习笔记-scrapy链接提取器爬取读书网链接写入MySQL数据库

    1.终端运行scrapy startproject scrapy_read,创建项目 2.登录读书网,选择国学(随便点一个) 3.复制链接(后面修改为包括其他页)  4.创建爬虫文件,并打开  5.滑倒下方翻页处,右键2,点击检查,查看到a标签网址,复制 6.修改爬虫文件规则allow(正则表达式),\\\'d\\\'表示数字,\\\'+\\\'表示多个,\\\'.\\\'使\\\'.\\\'生效

    2024年02月19日
    浏览(48)
  • selenium爬取网页内容,对网页内容进行点击

    所需要的库 首先明确所要爬取的网页,选择调用方法,增加无界面模式的无头参数,然后调用,获取网址,使页面放大,为最大化窗口 获取数据运用XPATH函数,将获取的数据作为item,运用XPATH函数获取,   模仿人点击下一页,运用 for语句,每10个一点,停留5秒 同样寻找下一

    2024年01月17日
    浏览(67)
  • 爬虫——Scrapy框架 (初步学习+简单案例)

    目录 1.scrapy基本用途: 2.结构: 3.scrapy文件结构(示例:game) 4.scrapy安装 二、 简单实例 1.创建项目(打开命令窗口) 2.打开项目  一、Scrapy框架 1.scrapy基本用途: Scrapy是一个快速、高效率的网络爬虫框架,用于抓取web站点并从页面中提取结构化的数据。 Scrapy被广泛用于数据

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包