爬蟲
第十天
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)
- return None 繼續請求,將request對象交給後續的中間件使用
- return Request 攔截當前請求,將返回值交給調度器
- return Response 攔截當前請求,將返回值交給爬蟲去解析
process_response(request, response, spider)
- return request 將請求交給調度器,放入請求隊列
- 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)