python网络爬虫(14)使用Scrapy搭建爬虫框架

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: python网络爬虫(14)使用Scrapy搭建爬虫框架阅读目录目的意义说明创建scrapy工程一些介绍说明创建爬虫模块-下载强化爬虫模块-解析强化爬虫模块-包装数据强化爬虫模块-翻页强化爬虫模块-存储强化爬虫模块-图像下载保存启动爬虫修正目的意义爬虫框架也许能简化工作量,提高效率等。

python网络爬虫(14)使用Scrapy搭建爬虫框架
阅读目录

目的意义
说明
创建scrapy工程
一些介绍说明
创建爬虫模块-下载
强化爬虫模块-解析
强化爬虫模块-包装数据
强化爬虫模块-翻页
强化爬虫模块-存储
强化爬虫模块-图像下载保存
启动爬虫
修正
目的意义
爬虫框架也许能简化工作量,提高效率等。scrapy是一款方便好用,拓展方便的框架。

本文将使用scrapy框架,示例爬取自己博客中的文章内容。

说明
学习和模仿来源:https://book.douban.com/subject/27061630/

创建scrapy工程
首先当然要确定好,有没有完成安装scrapy。在windows下,使用pip install scrapy,慢慢等所有依赖和scrapy安装完毕即可。然后输入scrapy到cmd中测试。

建立工程使用scrapy startproject myTestProject,会在工程下生成文件。

一些介绍说明
在生成的文件中,

创建爬虫模块-下载
在路径./myTestProject/spiders下,放置用户自定义爬虫模块,并定义好name,start_urls,parse()。

如在spiders目录下建立文件CnblogSpider.py,并填入以下:

1
2
3
4
5
6
import scrapy
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/default.html?page=1"]
def parse(self,response):
    pass

在cmd中,切换到./myTestProject/myTestProject下,再执行scrapy crawl cnblogs(name)测试,观察是否报错,响应代码是否为200。其中的parse中参数response用于解析数据,读取数据等。

强化爬虫模块-解析
在CnblogsSpider类中的parse方法下,添加解析功能。通过xpath、css、extract、re等方法,完成解析。

调取元素审查分析以后添加,成为以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import scrapy
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
    papers=response.xpath(".//*[@class='day']")
    for paper in papers:
        url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
        title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
        time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
        content=paper.xpath(".//*[@class='postCon']/div/text()").extract()
        print(url,title,time,content)
    pass

找到页面中,class为day的部分,然后再找到其中各个部分,提取出来,最后通过print方案输出用于测试。

在正确的目录下,使用cmd运行scrapy crawl cnblogs,完成测试,并观察显示信息中的print内容是否符合要求。

强化爬虫模块-包装数据
包装数据的目的是存储数据。scrapy使用Item类来满足这样的需求。

框架中的items.py用于定义存储数据的Item类。

在items.py中修改MytestprojectItem类,成为以下代码:

1
2
3
4
5
6
7
8
9
import scrapy
class MytestprojectItem(scrapy.Item):

# define the fields for your item here like:
# name = scrapy.Field()
url=scrapy.Field()
time=scrapy.Field()
title=scrapy.Field()
content=scrapy.Field()
pass

然后修改CnblogsSpider.py,成为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import scrapy
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
    papers=response.xpath(".//*[@class='day']")
    for paper in papers:
        url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
        title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
        time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
        content=paper.xpath(".//*[@class='postCon']/div/text()").extract()
         
        item=MytestprojectItem(url=url,title=title,time=time,content=content)
        yield item
    pass

将提取出的内容封装成Item对象,使用关键字yield提交。

强化爬虫模块-翻页
有时候就是需要翻页,以获取更多数据,然后解析。

修改CnblogsSpider.py,成为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
    papers=response.xpath(".//*[@class='day']")
    for paper in papers:
        url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
        title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
        time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
        content=paper.xpath(".//*[@class='postCon']/div/text()").extract()
         
        item=MytestprojectItem(url=url,title=title,time=time,content=content)
        yield item
    next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
    if next_page:
        yield scrapy.Request(url=next_page[0],callback=self.parse)
    pass

在scrapy的选择器方面,使用xpath和css,可以直接将CnblogsSpider下的parse方法中的response参数使用,如response.xpath或response.css。

而更通用的方式是:使用Selector(response).xxx。针对re则为Selector(response).re。

关于yield的说明:https://blog.csdn.net/mieleizhi0522/article/details/82142856

强化爬虫模块-存储
当Item在Spider中被收集时候,会传递到Item Pipeline。

修改pipelines.py成为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
import json
from scrapy.exceptions import DropItem
class MytestprojectPipeline(object):

def __init__(self):
    self.file=open('papers.json','wb')
def process_item(self, item, spider):
    if item['title']:
        line=json.dumps(dict(item))+"\n"
        self.file.write(line.encode())
        return item
    else:
        raise DropItem("Missing title in %s"%item)

重新实现process_item方法,收集item和该item对应的spider。然后创建papers.json,转化item为字典,存储到json表中。

另外,根据提示打开pipelines.py的开关。在settings.py中,使能ITEM_PIPELINES的开关如下:

然后在cmd中执行scrapy crawl cnblogs即可

另外,还可以使用scrapy crawl cnblogs -o papers.csv进行存储为csv文件。

需要更改编码,将csv文件以记事本方式重新打开,更正编码后重新保存,查看即可。

强化爬虫模块-图像下载保存
设定setting.py
1
2
3
4
5
6
7
8
9
10
11
12
ITEM_PIPELINES = {

'myTestProject.pipelines.MytestprojectPipeline':300,
'scrapy.pipelines.images.ImagesPipeline':1

}
IAMGES_STORE='.//cnblogs'
IMAGES_URLS_FIELD = 'cimage_urls'
IMAGES_RESULT_FIELD = 'cimages'
IMAGES_EXPIRES = 30
IMAGES_THUMBS = {

'small': (50, 50),
'big': (270, 270)

}
修改items.py为:
1
2
3
4
5
6
7
8
9
10
11
12
import scrapy
class MytestprojectItem(scrapy.Item):

# define the fields for your item here like:
# name = scrapy.Field()
url=scrapy.Field()
time=scrapy.Field()
title=scrapy.Field()
content=scrapy.Field()

cimage_urls=scrapy.Field()
cimages=scrapy.Field()
pass

修改CnblogsSpider.py为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import scrapy
from scrapy import Selector
from myTestProject.items import MytestprojectItem
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
    papers=response.xpath(".//*[@class='day']")
    for paper in papers:
        url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
        title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
        time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
        content=paper.xpath(".//*[@class='postCon']/div/text()").extract()
         
        item=MytestprojectItem(url=url,title=title,time=time,content=content)
        request=scrapy.Request(url=url, callback=self.parse_body)
        request.meta['item']=item

        yield request
    next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
    if next_page:
        yield scrapy.Request(url=next_page[0],callback=self.parse)
    pass
 
def parse_body(self, response):
    item = response.meta['item']
    body = response.xpath(".//*[@class='postBody']")
    item['cimage_urls'] = body.xpath('.//img//@src').extract()
    yield item

总之,修改以上三个位置。在有时候配置正确的时候却出现图像等下载失败,则可能是由于setting.py的原因,需要重新修改。

启动爬虫
建立main函数,传递初始化信息,导入指定类。如:

1
2
3
4
5
6
7
8
9
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from myTestProject.spiders.CnblogSpider import CnblogsSpider

if __name__=='__main__':

process = CrawlerProcess(get_project_settings())
process.crawl('cnblogs')
process.start()

修正
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import scrapy
from scrapy import Selector
from cnblogSpider.items import CnblogspiderItem
class CnblogsSpider(scrapy.Spider):

name="cnblogs"
allowd_domains=["cnblogs.com"]
start_urls=["https://www.cnblogs.com/bai2018/"]
def parse(self,response):
    papers=response.xpath(".//*[@class='day']")
    for paper in papers:
        urls=paper.xpath(".//*[@class='postTitle']/a/@href").extract()
        titles=paper.xpath(".//*[@class='postTitle']/a/text()").extract()
        times=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()
        contents=paper.xpath(".//*[@class='postCon']/div/text()").extract()
        for i in range(len(urls)):
            url=urls[i]
            title=titles[i]
            time=times[0]
            content=contents[i]
            item=CnblogspiderItem(url=url,title=title,time=time,content=content)
            request = scrapy.Request(url=url, callback=self.parse_body)
            request.meta['item'] = item
            yield request
    next_page=Selector(response).re(u'<a href="(\S*)">下一页</a>')
    if next_page:
        yield scrapy.Request(url=next_page[0],callback=self.parse)
    pass

def parse_body(self, response):
    item = response.meta['item']
    body = response.xpath(".//*[@class='postBody']")
    item['cimage_urls'] = body.xpath('.//img//@src').extract()
    yield item

感谢您能通过各种渠道找到我,并学习相关。
作文粗糙,有任何不明白或者因故过时,敬请留言。 感谢批评指正。
原文地址https://www.cnblogs.com/bai2018/p/11255185.html

相关文章
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
109 6
|
8天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
31 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
26天前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
56 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
1月前
|
JSON 数据处理 Swift
Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用
本文深入探讨了 Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用。URLSession 由苹果提供,支持底层网络控制;Alamofire 则是在 URLSession 基础上增加了更简洁的接口和功能扩展。文章通过具体案例对比了两者的使用方法,帮助开发者根据需求选择合适的网络编程工具。
29 3
|
1月前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
47 1
|
1月前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
1月前
|
网络协议 网络安全 Apache
一个整合性、功能丰富的.NET网络通信框架
一个整合性、功能丰富的.NET网络通信框架
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
221 4
|
4月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
5月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
【7月更文挑战第31天】在网络数据的海洋中,使用Python的`requests`库构建网络爬虫就像探索未知的航船。HTTP协议指导爬虫与服务器交流,收集信息。HTTP请求包括请求行、头和体,响应则含状态行、头和体。`requests`简化了发送各种HTTP请求的过程。
95 4