1. 程式人生 > >Scrapy爬取拉鉤網的爬蟲(爬取整站CrawlSpider)

Scrapy爬取拉鉤網的爬蟲(爬取整站CrawlSpider)

經過我的測試,拉鉤網是一個不能直接進行爬取的網站,由於我的上一個網站是扒的介面,所以這次我使用的是scrapy的整站爬取,貼上當時的程式碼(程式碼是我買的視訊裡面的,但是當時是不需要登陸就可以爬取的):

class LagouSpider(CrawlSpider):
    name = 'lagou'
    allowed_domains = ['www.lagou.com']
    start_urls = ['https://www.lagou.com']

    rules = (
        Rule(LinkExtractor(allow=("zhaopin/.*",)), follow=True),
        Rule(LinkExtractor(allow=("gongsi/j\d+.html",)), follow=True),
        Rule(LinkExtractor(allow=r'jobs/\d+.html'), callback='parse_job', follow=True),
    )
    def parse_job(self, response):
        #解析拉勾網的職位
        item_loader = LagouJobItemLoader(item=LagouJobItem(), response=response)
        item_loader.add_css("title", ".job-name::attr(title)")
        item_loader.add_value("url", response.url)
        item_loader.add_value("url_object_id", get_md5(response.url))
        item_loader.add_css("salary", ".job_request .salary::text")
        item_loader.add_xpath("job_city", "//*[@class='job_request']/p/span[2]/text()")
        item_loader.add_xpath("work_years", "//*[@class='job_request']/p/span[3]/text()")
        item_loader.add_xpath("degree_need", "//*[@class='job_request']/p/span[4]/text()")
        item_loader.add_xpath("job_type", "//*[@class='job_request']/p/span[5]/text()")

        item_loader.add_css("tags", '.position-label li::text')
        item_loader.add_css("publish_time", ".publish_time::text")
        item_loader.add_css("job_advantage", ".job-advantage p::text")
        item_loader.add_css("job_desc", ".job_bt div")
        item_loader.add_css("job_addr", ".work_addr")
        item_loader.add_css("company_name", "#job_company dt a img::attr(alt)")
        item_loader.add_css("company_url", "#job_company dt a::attr(href)")
        item_loader.add_value("crawl_time", datetime.now())

        job_item = item_loader.load_item()

        return job_item

加上item和管道檔案的修改直接使用後發現,直接給我來了一個302重定向,看到重定向到的頁面是登陸的頁面,也就是說拉鉤網進行了cookie的驗證,如果cookie不合法或者沒有帶,直接給你重定向到登陸頁面,所以在爬取之前要進行的是登陸操作,獲得cookie值,將cookie值帶過去,經過的測試這樣是可以使用的,下面貼上登陸的程式碼:

    def start_requests(self):
        browser = webdriver.Chrome(executable_path="/home/wqh/下載/chromedriver")
        browser.get(self.login_url)
        browser.find_element_by_css_selector("div:nth-child(2) > form > div:nth-child(1) > input").send_keys(
            "136XXXXXXX")
        browser.find_element_by_css_selector("div:nth-child(2) > form > div:nth-child(2) > input").send_keys(
            "wqhXXXXX")
        browser.find_element_by_css_selector(
            "div:nth-child(2) > form > div.input_item.btn_group.clearfix > input").click()
        import time
        time.sleep(10)
        cookies = browser.get_cookies()
        cookie_dict = {}
        for cookie in cookies:
            cookie_dict[cookie['name']] = cookie['value']
        with open('cookies_dict.lagou', 'wb') as wf:
            pickle.dump(cookie_dict, wf)
        logging.info('--------lagou cookies---------')
        print(cookie_dict)
        return [scrapy.Request(self.start_urls[0], cookies=cookie_dict)]

其中需要自己下載webdriver chrome版本,並將我的路徑改成自己的路徑 ,使用者名稱和密碼改成自己的就可以了,因為整站的爬蟲是從start_requests函式開始的,所以重寫這個函式,使得這個請求帶上cookie值就可以了。