第十一章 Scrapy入门:多线程+异步

在这里插入图片描述

简介

Scrapy 框架

  1. Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架。
  2. 用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片。
    (提高请求效率)
  3. Scrapy 使用了Twisted(aiohttp)异步网络框架来处理网络通讯,可以加快下载速度,并且包含了各种中间件接口,可以灵活的完成各种需求。

安装

pip install --upgrade pip
建议首先更新pip 再安装下列依赖库 否则可能会遇到诸多错误:

pip install twisted
安装 twisted可能会遇到这样问题
building ‘twisted.test.raiser’ extension
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
意思是说缺少C++的一些编译工具

所以这里建议大家直接安装编译好的twisted的whl文件
对应资源下载网址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

下载twisted对应版本的whl文件,cp后面是python版本,amd64代表64位,运行命令:
pip install C:\Users\CR\Downloads\Twisted-17.5.0-cp36-cp36m-win_amd64.whl
(后边一部分是 whl文件的绝对路径)

lxml之前应该安装过 可以略过
pip install lxml

这个安装应该没问题
pip install pywin32

安装scrapy框架
pip install Scrapy

如果中途报错,有TimeOut的字眼,应该是网络问题,重复安装几次就行

当然最省事的还是直接替换安装源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

知识

整体结构

在这里插入图片描述

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等

Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):可以扩展操作引擎和Spider中间通信的功能组件

一次完整的请求流程

——> Spider(爬虫)
——> Spider Middlewares(Spider中间件)
——> Scrapy Engine(引擎)
——> Scheduler(调度器)
——> Scrapy Engine(引擎)
——> Downloader Middlewares(下载中间件)
——> Downloader(下载器)
——> Downloader Middlewares(下载中间件)
——> Scrapy Engine(引擎)
——> Spider Middlewares(Spider中间件)
——> Spider(爬虫)
——> Spider Middlewares(Spider中间件)
——> Item Pipeline(管道)

Scrapy完成爬虫需要涉及的文件和步骤

  1. 新建项目 (scrapy startproject xxx):新建一个新的爬虫项

  2. 明确目标(编写items.py):明确你想要抓取的目标

  3. 制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页

  4. 存储内容(pipelines.py):设计管道存储爬取内容

入门案例

项目创建

执行:
终端输入代码:scrapy startproject JobSpider

结果:
目录结构:

在这里插入图片描述

确定目标

确定要爬取的网站和信息的url

抓取上海地区python招聘职位的情况,包括职位名称,公司名称,工作地点,薪资,发布时间:

目标地址:
https://search.51job.com/list/020000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare

1.打开项目中的item.py文件

在这里插入图片描述

2.创建一个JobspiderItem类,继承scrapy.Item,构建item模型(model)。并且定义类型为scrapy.Field的类属性,用来保存爬取到的数据

class JobspiderItem(scrapy.Item):
    name = scrapy.Field()
    city = scrapy.Field()
    pub_date = scrapy.Field()
    salary = scrapy.Field()

制作爬虫

生成爬虫脚本模板

执行:
终端输入代码:
1.cd JobSpider

2.scrapy genspider pythonPosition 51job.com

结果:

在这里插入图片描述

脚本说明

打开上一步生成的模板

import scrapy

class PythonpositionSpider(scrapy.Spider):
    name = 'PythonPosition'
    allowed_domains = ['51job.com']
    start_urls = ['http://51job.com/',]

    def parse(self, response):
        pass

说明:

1.name="":这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

2.allow_domains=[]是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

3.start_urls=():爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。

4.parse(self,response):解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
负责解析返回的网页数据(response.body),提取结构化数据(生成item)
生成需要下一页的URL请求。

修改代码

# 1.将start_urls的值修改为需要爬取的第一个url

start_urls=("https://search.51job.com/list/020000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=",)


# 2.重写parse方法,用XPath提取数据
def parse(self, response):
#print(response.body)
job_list = response.xpath("//div[@class='dw_table']/div[@class='el']")

for each in job_list:
    name = each.xpath("normalize-space(./p/span/a/text())").extract()[0]
    city = each.xpath("./span[@class='t3']/text()").extract()[0]
    pub_date = each.xpath(".//span[@class='t5']/text()").extract()[0]
    salary = each.xpath(".//span[@class='t4']/text()").extract()
    if len(salary)>0:
        salary = salary[0]
    else:
        salary = ''

    item = JobspiderItem()
    item['name'] = name
    item['city'] = city
    item['pub_date'] = pub_date
    item['salary'] = salary
    # 将获取的数据交给pipeline 
    yield item

yield 不仅可以返回数据对象,也可以返回请求对象。

储存内容

打开存储管道文件:
在这里插入图片描述

process_item 方法是用来处理每一个item数据对象的
close_spider 关闭爬虫时调用

# 写入CSV文件:
import csv
import codecs
class JobspiderPipeline(object):

    def __init__(self): 
        self.file = codecs.open('51job.csv', 'w', 'utf-8')
        self.wr = csv.writer(self.file, dialect="excel")
        self.wr.writerow(['name', 'pub_date', 'city', 'salary'])
    
    def process_item(self, item, spider): 
        self.wr.writerow([item['name'], item['pub_date'], item['city'], item['salary']])
        return item
    
    def close_spider(self, spider): 
        self.file.close()

在setting文件中启动储存管道

启用一个Item Pipeline组件

为了启用Item Pipeline组件,必须将它的类添加到settings.py文件ITEM_PIPELINES 配置,比如:

ITEM_PIPELINES = {
    #'mySpider.pipelines.SomePipeline': 300,"
    mySpider.pipelines.JsonPipeline":300
}

分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序通过pipeline,通常将这些数字定义在0-1000范围内(0-1000随意设置,数值越低,组件的优先级越高)

在这里插入图片描述

运行测试

1、创建run.py文件,和setting.py同级目录

2、添加代码:

from scrapy import cmdline

name = 'pythonPosition'
cmd = 'scrapy crawl {0}'.format(name)

#scrapy crawl pythonPosition
cmdline.execute(cmd.split())

其中name参数为spider的name。

3、run.py文件中右键运行。

任务

使用scrapy完成豆瓣电影top 250爬虫,电影的名称,简介,评分,引文等信息采集
https://movie.douban.com/top250?start=0&filter=2

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
  • 打赏
    打赏
  • 6
    评论
<span style="color:#333333;font-size:14px;">课程介绍:</span> <br /> <p style="font-size:14px;background-color:#FFFFFF;">         全面系统的学习Python爬虫入门视频课程,从零开始掌握Python爬虫项目的编写,学会独立开发常见的爬虫项目,让掌握好Python基础的你,把Python用起来! </p> <br /> <p style="font-size:14px;background-color:#FFFFFF;">         1、学完能够 从零开始掌握Python爬虫项目的编写,学会独立开发常见的爬虫项目; </p> <p style="font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="font-size:14px;background-color:#FFFFFF;">         2、学完能够掌握常见的 反爬处理手段,比如验证码处理、浏览器伪装、代理IP池技术、用户代理池技术等; </p> <p style="font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="font-size:14px;background-color:#FFFFFF;">         3、学完能够熟练使用 正则表达式、 XPath表达式进行信息提取; </p> <p style="font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="font-size:14px;background-color:#FFFFFF;">         4、学完掌握 抓包技术,掌握 屏蔽的数据信息如何进行提取,学会自动 模拟加载行为、进行网址构造、自动模拟进行 Ajax异步请求数据; </p> <p style="font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p style="font-size:14px;background-color:#FFFFFF;">         5、熟练掌握urllib模块, 熟练使用Scrapy框架进行爬虫项目开发。 </p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 6

打赏作者

狮范客

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值