- crawlspider
- 一種基於scrapy進行全站資料爬取的一種新的技術手段。
- crawlspider就是spider的乙個子類
- 連線提取器:linkextractor
- 規則解析器:rule
- 使用流程:
- 新建乙個工程
- cd 工程中
- 新建乙個爬蟲檔案:scrapy genspider -t crawl spidername www.***.com
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import linkextractor
from scrapy.spiders import crawlspider, rule
from suncrawlpro.items import suncrawlproitem,detail_item
class sunspider(crawlspider):
name = 'sun'
# allowed_domains = ['www.***.com']
start_urls = ['']
#例項化了乙個連線提取器物件
#作用:根據指定規則(allow=』正規表示式『)進行指定連線的提取
link = linkextractor(allow=r'type=4&page=\d+')#獲取頁碼連線
#獲取新聞詳情頁的連線
link_detail = linkextractor(allow=r"question/\d+/\d+\.shtml")
rules = (
#將link作用到了rule構造方法的引數1中
#作用:將連線提取器提取到的連線進行請求傳送且根據指定規則對請求到的資料進行資料解析
rule(link, callback='parse_item', follow=false),
#follow=true:將連線提取器 繼續作用到 連線提取器提取到的 連線 所對應的 頁面中
rule(link_detail, callback='parse_detail'),
)def parse_item(self, response):
#xpath表示式中是不可以出現tbody標籤
tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
for tr in tr_list:
title = tr.xpath('./td[2]/a[2]/text()').extract_first()
num = tr.xpath('./td[1]/text()').extract_first()
item = suncrawlproitem()
item['title'] = title
item['num'] = num
yield item
def parse_detail(self,response):
content = response.xpath('/html/body/div[9]/table[2]//tr[1]/td/text()').extract_first()
num = response.xpath('/html/body/div[9]/table[1]//tr/td[2]/span[2]/text()').extract_first()
num = num.split(':')[-1]
item = detail_item()
item['content'] = content
item['num'] = num
yield item
由於**發生改變,故訂正上述**
import scrapy
from scrapy.linkextractors import linkextractor
from scrapy.spiders import crawlspider, rule
from crawlspider.items import crawlspideritem, detailitem
class clspiderspider(crawlspider):
name = 'clspider'
# allowed_domains = ['www.xx.com']
start_urls = ['']
# 例項化了乙個連線提取器物件
# 作用:根據指定規則(allow=』正規表示式『)進行指定連線的提取
link = linkextractor(allow=r'id=1&page=\d+')#獲取頁碼的鏈結
detail_link = linkextractor(allow=r'index\?id=\d+')#獲取詳情頁的鏈結
rules = (
# 將link作用到了rule構造方法的引數1中
# 作用:將連線提取器提取到的連線進行請求傳送且根據指定規則對請求到的資料進行資料解析
rule(link, callback='parse_item', follow=true),
# follow=true:將連線提取器 繼續作用到 連線提取器提取到的 連線 所對應的 頁面中
rule(detail_link, callback='parse_detail'),
)def parse_item(self, response):
li_list = response.xpath('/html//div[2]/div[3]/ul[2]/li')
for li in li_list:
title = li.xpath('./span[3]/a/text()').extract_first()
num = li.xpath('./span[1]/text()').extract_first()
item = crawlspideritem()
item['title'] = title
item['num'] = num
# print(item)
yield item
def parse_detail(self, response):
content = response.xpath('/html//div[3]/div[2]/div[2]/div[2]/pre/text()').extract_first().strip().replace("\r\n", "").replace(" ", "")
num = response.xpath('/html//div[3]/div[2]/div[2]/div[1]/span[4]/text()').extract_first()
num = num.split(':')[-1]
item = detailitem()
item['num'] = num
item['content'] = content
yield item
items.py
# -*- coding: utf-8 -*-
# define here the models for your scraped items
## see documentation in:
# import scrapy
class suncrawlproitem(scrapy.item):
title = scrapy.field()
num = scrapy.field()
class detail_item(scrapy.item):
content = scrapy.field()
num = scrapy.field()
pipelines.py
# -*- coding: utf-8 -*-
# define your item pipelines here
## don't forget to add your pipeline to the item_pipelines setting
# see:
class suncrawlpropipeline(object):
def process_item(self, item, spider):
if item.__class__.__name__ == 'detail_item':
content = item['content']
num = item['num']
print(item)
else:
title = item['title']
num = item['num']
print(item)
return item
Webmagic控制爬取深度
最近搞畢業設計,使用到了webmagic,但是才開始學習,對各個元件都還不是很熟悉。相信初學者都會遇到乙個問題,那就是 必須要讓所有url都處理完,才能結束整個爬蟲過程嗎?一開始,我用的是非常簡單的方法,如下 int pagecnt 0 public static int limit 10000 最...
CrawlSpider實現的全站資料的爬取
規則解析器rule follow true 將連線提取器 繼續作用到 連線提取器提取到的連線 所對應的 頁面原始碼中 為什麼scrapy不可以實現分布式 scrapy reids元件的作用是什麼 提供可以被共享的管道和排程器 分布式的實現流程 修改爬蟲檔案 修改settings配置檔案 修改redi...
Python爬取小說 2 單章節爬取
coding utf 8 urlopen 開啟 request 請求 from urllib.request import urlopen,request 匯入gzip包 解壓gzip 封裝請求 req request url path,headers headers 開啟鏈結 conn urlop...