Python爬蟲入門教程 40-100 部落格園Python相關40W部落格抓取 scrapy

夢想橡皮擦發表於2019-02-25

爬前叨叨

第40篇部落格吹響號角,爬取部落格園部落格~本文最終抓取到了從2010年1月1日到2019年1月7日的37W+文章,後面可以分析好多東西了呢

經常看部落格的同志知道,部落格園每個欄目下面有200頁,多了的資料他就不顯示了,最多顯示4000篇部落格如何儘可能多的得到部落格資料,是這篇文章研究的一點點核心內容,能√get到多少就看你的了~

python3爬蟲入門教程

單純的從每個欄目去爬取是不顯示的,轉換一下思路,看到搜尋頁面,有時間~,有時間!
python3爬蟲入門教程

注意看URL連結

https://zzk.cnblogs.com/s/blogpost?Keywords=python&datetimerange=Customer&from=2019-01-01&to=2019-01-01  

這個連結得到之後,其實用一個比較簡單的思路就可以獲取到所有python相關的文章了,迭代時間。
下面編寫核心程式碼,比較重要的幾個點,我單獨提煉出來。

  1. 頁面搜尋的時候因為加了驗證,所以你必須要獲取到你本地的cookie,這個你很容易得到
  2. 字典生成器的語法是時候去複習一下了
import scrapy
from scrapy import Request,Selector
import time
import datetime

class BlogsSpider(scrapy.Spider):
    name = `Blogs`
    allowed_domains = [`zzk.cnblogs.com`]
    start_urls = [`http://zzk.cnblogs.com/`]
    from_time = "2010-01-01"
    end_time = "2010-01-01"
    keywords = "python"
    page =1
    url = "https://zzk.cnblogs.com/s/blogpost?Keywords={keywords}&datetimerange=Customer&from={from_time}&to={end_time}&pageindex={page}"
    custom_settings = {
        "DEFAULT_REQUEST_HEADERS":{
            "HOST":"zzk.cnblogs.com",
            "TE":"Trailers",
            "referer": "https://zzk.cnblogs.com/s/blogpost?w=python",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 Gecko/20100101 Firefox/64.0"

        }
    }


    def start_requests(self):
        cookie_str = "想辦法自己獲取到"
        self.cookies = {item.split("=")[0]: item.split("=")[1] for item in cookie_str.split("; ")}
        yield Request(self.url.format(keywords=self.keywords,from_time=self.from_time,end_time=self.end_time,page=self.page),cookies=self.cookies,callback=self.parse)

頁面爬取完畢之後,需要進行解析,獲取翻頁頁碼,同時將時間+1天,下面的程式碼重點看時間疊加部分的操作。

    def parse(self, response):
        print("正在爬取",response.url)
        count = int(response.css(`#CountOfResults::text`).extract_first()) # 獲取是否有資料
        if count>0:
            for page in range(1,int(count/10)+2):
                # 抓取詳細資料
                yield Request(self.url.format(keywords=self.keywords,from_time=self.from_time,end_time=self.end_time,page=page),cookies=self.cookies,callback=self.parse_detail,dont_filter=True)

        time.sleep(2)
        # 跳轉下一個日期
        d = datetime.datetime.strptime(self.from_time, `%Y-%m-%d`)
        delta = datetime.timedelta(days=1)
        d = d + delta
        self.from_time = d.strftime(`%Y-%m-%d`)
        self.end_time =self.from_time
        yield Request(
            self.url.format(keywords=self.keywords, from_time=self.from_time, end_time=self.end_time, page=self.page),
            cookies=self.cookies, callback=self.parse, dont_filter=True)

頁面解析入庫

本部分操作邏輯沒有複雜點,只需要按照流程編寫即可,執行程式碼,跑起來,在mongodb等待一些時間

db.getCollection(`dict`).count({}) 

返回

372352條資料

    def parse_detail(self,response):
        items = response.xpath(`//div[@class="searchItem"]`)
        for item in items:
            title = item.xpath(`h3[@class="searchItemTitle"]/a//text()`).extract()
            title = "".join(title)

            author = item.xpath(".//span[@class=`searchItemInfo-userName`]/a/text()").extract_first()
            public_date = item.xpath(".//span[@class=`searchItemInfo-publishDate`]/text()").extract_first()
            pv = item.xpath(".//span[@class=`searchItemInfo-views`]/text()").extract_first()
            if pv:
                pv = pv[3:-1]
            url = item.xpath(".//span[@class=`searchURL`]/text()").extract_first()
            #print(title,author,public_date,pv)
            yield {
                "title":title,
                "author":author,
                "public_date":public_date,
                "pv":pv,
                "url":url
            }

資料入庫

一頓操作猛如虎,資料就到手了~後面可以做一些簡單的資料分析,那篇部落格再見啦@

python3爬蟲入門教程

相關文章