一、scrapy shell交互端的使用
scrapy shell是scrapy的一个交互终端,其作用是不用创建scrapy项目的情况下尝试以及调试代码 ,最常用的是调试xpath语句。
使用方法:
1、cmd命令行中输入: scrapy shell 网址
2、输入:response.xpath(…)
案例:
二、将公共变量放在settings文件中
比如账号密码等,再在别的文件中,用from settings import ?导入并使用。
案例:
1、在settings文件中添加:
2、在别的文件中导入并使用:
三、middlewares下载中间件的使用
下载中间件是引擎和下载器之间通信的中间件;我们可以在此设置代理(随机ua) ,以达到反反爬的目的。
下载中间件中封装了2个重要的方法:
(1)process_request(self,request,spider) (重点)
(2)process_response(self,request,spider)(了解既可)
1、process_request(self,request,spider) (重点)
当每个request(url)通过下载中间件的时候,该方法调用。
- 参数
request 就是被拦截的请求(也就是那个url)
spider 爬虫类(即爬虫文件中class XXXSpider)实例化的对象
- 返回值
(1) 返回None :它正常的操作 ,scrapy正常的去处理request对象, 执行对应的方法
(2)返回response对象: 就是中间件直接把返回的response对象给引擎,不经过下载器了
(3)返回request对象: 就是中间件把它返回的request对象给下载器 ,下载器根据这个request对象返回数据,相当于是替换了request
2、process_response(self,request,spider)
当下载器完成http请求的时候,该方法调用。
那么,要如何设置随机ua呢?
步骤:
第一步 在middlewares文件中添加随机ua
第二步 重写process_request()方法
第三步 千万不要忘记在settings里面开启下载中间件
第四步 编写爬虫文件
以http://httpbin.org/user-agent为例,该网站可以显示本电脑的ua
scrapy.Request()会默认去掉重复项(response,可以理解成重复的url),参数dont_filter=True表示不去重。
结果:(一直在打印结果)
对比下去重的结果:也就是说只打印出一个ua
补充1:前两步也可以用fake_useragent合成一步来写:
关于上图中的111行的说明:
(1)Request()方法当中的所有参数都可以作为请求对象request的属性;
(2)Request()方法中的参数有:url,meta,callback,headers,cookies等;
(3)headers,cookies要以字典的形式添加。
补充2:设置代理IP
说明:
(1)设置代理ip,我们添加request请求对象,要使用meta属性;
所以,meta的作用有2个,1是在不同解析函数间传递数据,2是定义代理ip
补充3:设置cookies(记得settings.py文件中第36行取消注释并为True,即COOKIES_ENABLED = True)
settings.py文件中第36行的#COOKIES_ENABLED = False的说明:
(1)取消注释,即COOKIES_ENABLED = False,则找的是settings.py文件中的第42行DEFAULT_REQUEST_HEADERS里面的cookies
(2)取消注释并为True,即COOKIES_ENABLED = True,则找的是中间件中的cookies
四、案例(爬取汽车之家)
需求:爬取汽车之家奥迪汽车的图片,如下图:
https://car.autohome.com.cn/photolist/series/18/p1/
第一步 页面分析
1、网页原代码中是否有我们要爬取的图片:
(1)我们右键检查,发现imgb标签中的src属性值就是要爬取图片的url;
我们复制这个属性值,到网页原代码中去查找;
发现原代码中是有的。
所以我们要做的就是在原代码中去爬取上图中的src属性值,在逐个访问。
爬虫文件代码:(不要忘记修改settings文件中的ROBOTSTXT_OBEY = False和添加LOG_LEVEL = ‘WARNING’以及DEFAULT_REQUEST_HEADERS中添加’user-agent’)
import scrapy
class AudiSpider(scrapy.Spider):
name = 'audi'
allowed_domains = ['car.autohome.com.cn']
start_urls = ['https://car.autohome.com.cn/photolist/series/18/p1/']
def parse(self, response):
# 找ul下面的li
lis = response.xpath('//ul[@id="imgList"]/li')
for li in lis:
item = {}
item['src'] = 'https:' + li.xpath('./a/img/@src').extract_first()
yield item
管道文件代码:(不要忘记打开settings文件中的管道设置)
from urllib import request
import os
class PicPipeline:
def process_item(self, item, spider):
# 获取图片的url
src = item['src']
# 获取url的后半部分作为图片的名字
img_name = item['src'].split("__")[-1]
# 保存图片:
file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images') # 动态的添加路径,文件夹images要提前创建好
request.urlretrieve(src,file_path + '/' + img_name) #请求src图片地址获取图片,并按指定路径和文件名保存
return item
补充知识点:
结果:
五、使用scrapy内置的下载图片/文件的方法
(1)使用images pipeline下载图片的步骤:
• 在爬虫文件中定义好一个Item,
然后在items文件中为这个item定义两个属性,分别为image_urls以及images(这2个属性名不能自定义,必须是image_urls以及images,因为scrpy有内部逻辑和它对应)。image_urls是用来存储需要下载的文件的url链接,需要给一个列表。当文件下载完成后,会把文件下载的相关信息存储到item的images属性中,如下载路径、下载的url和图片校验码等。(本案例用不到)
• 在配置文件settings.py中配置IMAGES_STORE(这个名称也是不能自定义),这个配置用来设置文件下载路径。
• 在settings文件中开启ITEM_PIPELINES并设置成:‘scrapy.pipelines.images.ImagesPipeline’:1