1. 程式人生 > >Python資料爬蟲學習筆記(17)Scrapy糗事百科自動爬蟲

Python資料爬蟲學習筆記(17)Scrapy糗事百科自動爬蟲

一、需求:在糗事百科主頁下,無需設定頁碼,自動爬取所有段子詳情頁的段子完整內容。

(1)糗事百科主頁:

(2)段子詳情頁:

二、Scrapy實現思路:

       在糗事百科主頁上自動提取出所有段子的詳情連結,在每個段字詳情頁中爬取段子內容。

三、網頁原始碼分析:

1、糗事百科段子詳情頁連結分析:注意到每個段子詳情的連結都含有“article”

2、糗事百科段子詳情頁原始碼分析,注意到段子內容被class屬性為content的div標籤所包圍,段子連結則存在於rel屬性為canonical的link標籤的href屬性中:

四、建立Scrapy專案:

1、進入CMD,通過命令進入合適的目錄,輸入:

scrapy startproject qiushibaike

     qiushibaike為專案名稱。

2、通過CMD命令進入建立的專案,通過命令建立爬蟲檔案:

scrapy genspider -t crawl autoSpider qiushibaike.com

五、編寫程式碼:

1、items.py:

import scrapy
class QiushibaikeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #設定爬取段子內容
    content=scrapy.Field()
    #設定爬取段子連結
    link=scrapy.Field()

2、pipelines.py:

class QiushibaikePipeline(object):
    def process_item(self, item, spider):
        for i in range(0,len(item["content"])):
            print(item["content"][i])
            print(item["link"][i])
        return item

3、settings.py:

#設定瀏覽器偽裝
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2415.400'
#設定不遵守robots協議
ROBOTSTXT_OBEY = False
#設定啟用pipelines
ITEM_PIPELINES = {
     'qiushibaike.pipelines.QiushibaikePipeline': 300,
}

4、autoSpider.py:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from qiushibaike.items import QiushibaikeItem
#模擬瀏覽器
from scrapy.http import Request


class AutospiderSpider(CrawlSpider):
    name = 'autoSpider'
    allowed_domains = ['qiushibaike.com']
    #註釋掉自帶的start_urls,以start_requests函式來代替,目的是為了瀏覽器偽裝
    '''
    start_urls = ['http://www.qiushibaike.com/']
    '''
    def start_requests(self):
        #模擬瀏覽器
        ua={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2415.400"}
        yield Request('http://www.qiushibaike.com/',headers=ua)

    #設定自動爬取連結的規則,allow後是過濾連結的正則表示式,follow則設定連結是否跟進
    rules = (
        Rule(LinkExtractor(allow=r'article'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        #段子內容及連結提取
        i = QiushibaikeItem()
        i["content"] = response.xpath("//div[@class='content']/text()").extract()
        i["link"] = response.xpath("//link[@rel='canonical']/@href").extract()
        return i

六、執行結果:

爬蟲會持續執行...........可使用Ctrl+C快捷鍵強制停止。

感謝韋瑋老師的指導