欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: 小知识