龙空技术网

Python爬虫系列——Day005

纸始终包不住火 44

前言:

而今我们对“pythonscrapyshell”可能比较重视,咱们都想要剖析一些“pythonscrapyshell”的相关内容。那么小编同时在网摘上汇集了一些有关“pythonscrapyshell””的相关文章,希望朋友们能喜欢,大家快快来了解一下吧!

是什么?

scrapy

为什么?

通过之前的学习, 可以总结出爬虫的流程有 爬取内容, 解析内容, 存储内容.   但之前只是针对单个url内容进行爬取, 如何扩展到对多个url进行爬取, 对多个url爬取的时候代码肯定有可以复用的地方, 抽取这些公共部分进行代码精简以及优雅处理多个url异步爬取之间的调度问题我们并没有思考过. 而scrapy提供了这样的解决方案, 它可能是爬虫界老手在写了一个又一个爬虫后提炼的智慧结晶. 学会它的使用, 可以让我们爬取时更加牛皮.
举止动念, 无不是业. 怎么办?

scrapy 爬取流程

scrapy 虽然优秀, 但是它的定位依旧是爬虫, 所以它的本质也是 爬取内容, 解析内容, 存储内容. scrapy只是一种手段, 正如编程也只是我们实现目的的一种手段而已. 之前学习的 requests 库和解析库 lxml beautifulsoup4 等依旧可以用, 不过 scrapy 自己实现了一套完整的爬取和解析 的流程, 通过对它的学习, 可以使我们摆脱之前各种第三方库的依赖, 只需要一条命令 pip install scrapy .scrapy 运行爬虫命令之后, Spider会执行start_requests方法将爬虫中定义的start_urls包装成一个个request对象交给Engine,然后将获取的响应内容封装成一个个response对象, 我们就可以通过parse方法进行response解析, 然后通过解析response来决定是否继续发送新的请求(自行封装request对象, 通过parse方法返回给engine.)

scrapy 持久化的两种方式

在 parse 方法的返回值设为字典列表类型 [ { ‘k1’: ‘v1’ }, {\ ‘k1’: ‘v1’ }] , 使用爬虫运行命令指定 存储文件名: scrapy crawl xx -o data.csv , 只能存储 .csv .xml .json 等几种文件类型. pipelines item 存储: 在items.py 中创建item类, 定义需要存储的字段, 在爬虫.py 的 parse 方法中将item对象实例化, 并作为返回值返回, 在 pipelines.py 中即可通过创建一个类, 在process_item方法中处理item数据, 最后将该类在 settings.py 中进行配置即可生效.

scrapy 命令

创建项目 scrapy startproject 项目名生成爬虫 scrapy genspider 文件名 目标url运行爬虫 scrapy runspider 文件名 ( 文件路径一定要正确 )

or scrapy crawl 爬虫名称

开启shell模式 scrapy shell 目标url

Scrapy 常用参数

request 和 response 在 scrapy 下和 requests 库中是有差异的请求对象request的常用属性: request.headers request.cookies request.url request.encoding响应对象response的常用属性: response.headers response.request.cookies response.url… 响应对象response的内容字节流: response.body 响应对象response的xpath方法: response.xpath(‘//div[@name=”formData”]/text()’).extract_first()响应对象response的css方法: response.css(‘.class1::text’).extract()response.css(‘.class1::attr(href)’).extract()

Scrapy 简单配置( settings.py )

USER_AGENT = ‘’ROBOTSTXT_OBEY = FalseLOG_LEVEL = ‘WARNING’Code

# items.pyimport scrapyclass ChoutiItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    user = scrapy.Field()    update = scrapy.Field()    detail = scrapy.Field()    likes = scrapy.Field()    comments = scrapy.Field()# test.pyimport scrapyfrom project.items import ChoutiItemclass TestSpider(scrapy.Spider):    name = 'test'    allowed_domains = ['dig.chouti.com']    start_urls = [';]    # driver = webdriver.Chrome(executable_path=r'C:\Users\Jack\Downloads\chromedriver.exe')        def parse(self, response, **kwargs):        print(f'{"scrapy 框架启动":=^100}')        selectors = response.css('.link-info-con.left')        for item in selectors:            project_item = ChoutiItem()            item_user = item.css('.left.author-name::text').extract_first()            item_content = item.xpath(                r'.//a[contains(@class, "link-title") and contains(@class, "link-statistics")]/text()').extract_first()            item_update = item.css('.time-update::text').extract_first()            item_likes = item.css('.recommend-num.left::text').extract_first()            item_comments = item.css('.comment-num.left::text').extract_first()            project_item['user']= item_user            project_item['update'] = item_update            project_item['detail'] = item_content            project_item['likes' ]= item_likes            project_item['comments'] = item_comments            yield project_item# pipelines.pyclass ProjectPipeline:        def open_spider(self, spider):        print('pipe start', spider)        # 此处定义文件处理对象 f        def process_item(self, item, spider):        print('pipe item', item)        with open('data.txt', 'w', encoding='utf8') as f:            f.write(item['user']+'\n')            f.write(item['update']+'\n')            f.write(item['detail']+'\n')        return item        def close_spider(self, spider):        print('pipe close')        # 此处对定义的文件处理对象 f 进行资源释放

标签: #pythonscrapyshell