scrapy (二)
程序员文章站
2022-03-13 18:20:35
...
scrapy (二)
1.scrapy中构造requests的几个方法
1.yield response.follow(
) 当next_url不全时,自动补全net_url
next_url = response.xpath('//a[@class="pn-next"]/@href').extract_first()
yield response.follow(
next_url,
callback=self.parse_book,
meta={'book': item}
)
2.scrapy.Request()
3.中间件中的process_exception
当中间件中的process_exception 捕获到 超时异常 或其他 代理原因时 可使用 process_exception捕获异常
def process_exception(self, request, exception, spider):
# pass
self.logger.debug('捕获到超时异常!!!!!')
self.logger.debug('重试')
request.meta['proxy'] = 'https:60.235.28.165:8088' #更换代理或其他
return request
#在爬虫文件中重写父类 处理捕获到的 异常重新构造一个请求
def make_requests_from_url(self, url):
return scrapy.Request(url=url, meta={'download_timeout': 5}, callback=self.parse)
4.start_requests()和make_requests_from_url()的区别
有start_requests时不会执行另一个 作用:构造一个request url 可以自定义
make_requests_from_url 的url来自 start_urls列表 作用: 将其中的url转换为request
2.from copy import deepcopy
scrapy 中循环嵌套循环时 使用 deepcopy(item)开启一个新的内存空间 使得item中的数据不会被覆盖,
from copy import deepcopy
class JingdSpider(scrapy.Spider):
name = 'jingd'
start_urls = ['https://book.jd.com/booksort.html']
def parse(self, response):
dt_list = response.xpath('//*[@id="booksort"]/div[2]/dl/dt[1]') #
for dt in dt_list:
item = JdongItem()
item['big_name'] = dt.xpath('./a/text()').extract_first()
for em in em_list:
item['small_name'] = em.xpath('./a/text()').extract_first()
yield scrapy.Request(url=small_link, callback=self.parse_book, meta={'book': deepcopy(item)})
#for循环下的item
def parse_book(self, response):
item = response.meta['book']
book_list = response.xpath('//*[@id="plist"]/ul/li[1]') #
for book in book_list:
item['img_url'] = 'https:' + book.xpath
yield scrapy.Request(url=price_url, callback=self.parse_price, meta={'book': deepcopy(item)})
#for 循环下的item
def parse_price(self, response):
item = response.meta['book']
item['book_price'] = loads(response.body.decode())[0]['p']
#没有在循环下
yield item
没有在循环下的meta不用deepcopy
上一篇: 二分法实现一个整形有序数组的二分查找
下一篇: Win 2008 r2 安装SSH服务器
推荐阅读
-
德国十大模特 第二名竟然是一名内衣模特!鼻血都要流完了
-
Android实现联动下拉框二级地市联动下拉框功能
-
Mybaits 源码解析 (九)----- 全网最详细,没有之一:一级缓存和二级缓存源码分析
-
朱元璋宠幸苏坦妹,第二天就下令将其处斩?
-
Java对象的"后事处理"——垃圾回收(二)
-
俗话说官大一级压死人 为什么清朝二品官比一品官混的好呢
-
以数字“6”的形式给二维数组赋连续的值
-
.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程
-
Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解
-
C# LINQ学习笔记二:LINQ标准查询操作概述