Python資料爬蟲學習筆記(17)Scrapy糗事百科自動爬蟲
阿新 • • 發佈:2018-12-13
一、需求:在糗事百科主頁下,無需設定頁碼,自動爬取所有段子詳情頁的段子完整內容。
(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快捷鍵強制停止。