15天學會爬蟲 第十天

爬蟲

第十天

crawlspider的使用

scrapy genspider -t crawl spider_name allowed_domain

class GtSpider(CrawlSpider):
    name = 'gt'
    allowed_domains = ['guokr.com']
    start_urls = ['https://www.guokr.com/ask/highlight']

    rules = (
        Rule(LinkExtractor(allow=r'/ask/highlight/\?page=\d+'), follow=True),
        # 提取詳情頁的url地址
        Rule(LinkExtractor(allow=r'question/\d+/'), callback='parse_item'),
    )
  • parse()方法開發者不能使用,rules規則的提取,默認使用的就是parse方法
  • Rule(LinkExtractor(allow=r’/ask/highlight/?page=\d+’), follow=True,callback=‘parse_item’)
    • LinkExtractor:url的規則提取方式
    • callback:符合規則的url,會自動發起請求,將來得到的響應交給callback方式去解析
    • follow:符合規則的url,自行發起請求,得到響應會再次被rules中的規則進行匹配提取

下載器中間件的使用

  • 在middlewares.py中定義一個類,必須具有兩個方法
    • prcess_request(request,spier)
    • process_response(request,response,spider)
class DemoMidddleware:
    def process_request(self, request, spider):
        request.meta["proxy"] = "http://127.0.0.1:8000"

    def process_response(self, request, response, spider):
        print(request.headers["User-Agent"], "*" * 100)
        return response
  • 關於兩個方法的返回值

    prcess_request(request,spier)

    1. return None 繼續請求,將request對象交給後續的中間件使用
    2. return Request 攔截當前請求,將返回值交給調度器
    3. return Response 攔截當前請求,將返回值交給爬蟲去解析

    process_response(request, response, spider)

    1. return request 將請求交給調度器,放入請求隊列
    2. return response 將response交給後續的中間價,或者到達爬蟲去解析
  • 應用:

    • 設置UA
    process_request(self,request,spider):
        request.headers['User-Agent'] = random('UA')
    
    • 設置代理
    process_request(self,request,spider):
        request.meta['proxy'] = 'http://192.168.1.1:80'
    
    • 設置cookies(主要是爲了反反爬)
    process_request(self,request,spider):
        request.cookies = cookies # 可以從cookies池隨機取出一個
    
    • scrpay集成selenium
    class DemoPipeline
        open_spdier(self,spider):
            if spider.name = "itcast":
                spider.driver = webdirver.Chrome()
    
        close_spider(self,spider)if spider.name = "itcast":
                spider.driver.quit()
    class DemoMidddleware
        process_request(self,request,spdier)if spider.name = "itcast":
                spdier.dirver.get(request.url)
                return HtmlResponse(body=spdier.dirver.page_source,request=request,encoding="utf-8",url=spider.dirver.current_url)
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章