Scrapy
- Scrapy是純python實(shí)現(xiàn)的一個(gè)為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。
- Scrapy使用了Twisted異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊,可以加快我們的下載速度,并且包含了各種中間件接口,可以靈活的完成各種需求
1、安裝
2、認(rèn)識(shí)scrapy框架
2.1 scrapy架構(gòu)圖
Scrapy Engine(引擎)
: 負(fù)責(zé)Spider
、ItemPipeline
、Downloader
、Scheduler
中間的通訊,信號(hào)、數(shù)據(jù)傳遞等。
Scheduler(調(diào)度器)
: 它負(fù)責(zé)接受引擎
發(fā)送過來的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列,入隊(duì)列,當(dāng)引擎
需要時(shí),交還給引擎
。
Downloader(下載器)
:負(fù)責(zé)下載Scrapy Engine(引擎)
發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎)
,由引擎
交給Spider
來處理
Spider(爬蟲)
:它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎
,再次進(jìn)入Scheduler(調(diào)度器)
Item Pipeline(管道)
:它負(fù)責(zé)處理Spider
中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲(chǔ)等)的地方.
Downloader Middlewares(下載中間件)
:你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件
Spider Middlewares(Spider中間件)
:可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎
和Spider
中間通信
的功能組件(比如進(jìn)入Spider
的Responses和從Spider
出去的Requests)
2.2 Scrapy運(yùn)行的大體流程:
1.引擎從spider拿到第一個(gè)需要處理的URL,并將request請(qǐng)求交給調(diào)度器。
2.調(diào)度器拿到request請(qǐng)求后,按照一定的方式進(jìn)行整理排列,入隊(duì)列,并將處理好的request請(qǐng)求返回給引擎。
3.引擎通知下載器,按照下載中間件的設(shè)置去下載這個(gè)request請(qǐng)求。
4.下載器下載request請(qǐng)求,并將獲取到的response按照下載中間件進(jìn)行處理,然后后交還給引擎
,由引擎
交給spider
來處理。對(duì)于下載失敗的request,引擎會(huì)通知調(diào)度器進(jìn)行記錄,待會(huì)重新下載。
5.spider拿到response,并調(diào)用回調(diào)函數(shù)(默認(rèn)調(diào)用parse函數(shù))去進(jìn)行處理,并將提取到的Item數(shù)據(jù)和需要跟進(jìn)的URL交給引擎。
6.引擎將item數(shù)據(jù)交給管道進(jìn)行處理,將需要跟進(jìn)的URL交給調(diào)度器,然后開始循環(huán),直到調(diào)度器中不存在任何request,整個(gè)程序才會(huì)終止。
2.3 制作scrapy爬蟲步驟:
1.創(chuàng)建項(xiàng)目:通過(scrapy startproject 項(xiàng)目名)來創(chuàng)建一個(gè)項(xiàng)目
2.明確目標(biāo):編寫items.py文件,定義提取的Item
3.制作爬蟲:編寫spiders/xx.py文件,爬取網(wǎng)站并提取Item
4.存儲(chǔ)內(nèi)容:編寫pipelines.py文件,設(shè)計(jì)管道來存儲(chǔ)提取到的Item(即數(shù)據(jù))
3、入門教程
3.1 創(chuàng)建項(xiàng)目在開始爬蟲之前,第一步需要?jiǎng)?chuàng)建一個(gè)項(xiàng)目。先進(jìn)入打算存儲(chǔ)代碼的目錄,運(yùn)行以下命令:
scrapy startproject myProject
其中myProject為項(xiàng)目名,運(yùn)行上述命令后,在當(dāng)前目錄下會(huì)創(chuàng)建一個(gè)myProject目錄,該目錄包含以下內(nèi)容:
.
├── myProject
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ └── __init__.py
└── scrapy.cfg
scrapy.cfg:項(xiàng)目的配置文件
myProject/items.py:項(xiàng)目中的目標(biāo)文件
myProject/middlewares.py:項(xiàng)目中的中間件文件
myProject/pipelines.py:項(xiàng)目中的管道文件
myProject/settings.py:項(xiàng)目中的設(shè)置文件
myProject/spiders:放置spider代碼的目錄
3.2 明確目標(biāo)(定義Item)
我們打算抓取網(wǎng)站http://www.itcast.cn/channel/teacher.shtml里所有老師的姓名、職稱、入職時(shí)間和個(gè)人簡(jiǎn)介:
- 首先打開myProject/items.py文件
- Item是保存爬取到的數(shù)據(jù)的容器,其使用方法和python字典類似
- 創(chuàng)建一個(gè)scrapy.Item 類, 并且定義類型為 scrapy.Field的類屬性來定義一個(gè)Item(類似于ORM的映射關(guān)系)
- 創(chuàng)建一個(gè)MyprojectItem 類,和構(gòu)建item模型(model)
import scrapy
class MyprojectItem(scrapy.Item):
name = scrapy.Field()
title = scrapy.Field()
hiredate = scrapy.Field()
profile = scrapy.Field()
3.3 制作爬蟲在項(xiàng)目根目錄下輸入以下命令,可以在myProject/spiders目錄下創(chuàng)建一個(gè)名為itcast的爬蟲(itcast.py),并且指定爬蟲作用域的范圍itcast.cn:
scrapy genspider itcast itcast.cn
打開itcast.py,默認(rèn)添上了以下內(nèi)容:
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ['http://itcast.cn/']
def parse(self, response):
pass
要建立一個(gè)Spider, 你必須用scrapy.Spider類創(chuàng)建一個(gè)子類,并確定了3個(gè)強(qiáng)制的屬性和1個(gè)方法。
name:
這個(gè)爬蟲的識(shí)別名稱,必須是唯一的
allow_domains:
爬蟲的約束區(qū)域,規(guī)定爬蟲只爬取這個(gè)域名下的網(wǎng)頁(yè),不存在的URL會(huì)被忽略。
start_urls:
爬取的URL列表。因此,第一個(gè)被獲取到的頁(yè)面將是其中之一。 后續(xù)的URL則從初始URL返回的數(shù)據(jù)中提取。
parse(self, response):
Request對(duì)象默認(rèn)的回調(diào)解析方法。每個(gè)初始URL完成下載后將被調(diào)用,調(diào)用的時(shí)候傳入從每一個(gè)URL傳回的Response對(duì)象來作為唯一參數(shù),該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response.body),提取數(shù)據(jù)(生成item)以及生成需要進(jìn)一步處理的URL的Request對(duì)象
修改start_urls為第一個(gè)需要爬取的URL:
start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajavaee']
修改parse方法提取Item:
def parse(self, response):
for teacher in response.xpath("http://ul[@class='clears']/li/div[@class='main_mask']"):
#將提取到到的數(shù)據(jù)封裝到一個(gè)MyprojectItem對(duì)象中
item = MyprojectItem()
#利用xpath返回該表達(dá)式所對(duì)應(yīng)的所有節(jié)點(diǎn)的selector list列表
#調(diào)用extract方法序列化每個(gè)節(jié)點(diǎn)為Unicode字符串并返回list
name = teacher.xpath('h2/text()').extract()[0]
title = teacher.xpath('h2/span/text()').extract()[0]
hiredate = teacher.xpath('h3/text()').extract()[0].split(':')[-1]
profile = teacher.xpath('p/text()').extract()[0]
item['name'] = name
item['title'] = title
item['hiredate'] = hiredate
item['profile'] = profile
# 使用yield將獲取的數(shù)據(jù)交給pipelines,如果使用return,則數(shù)據(jù)不會(huì)經(jīng)過pipelines
yield item
3.4 存儲(chǔ)內(nèi)容
Feed輸出
如果僅僅想要保存item,可以不需要實(shí)現(xiàn)任何的pipeline,而是使用自帶的Feed輸出(Feed export)。主要有以下4種方式,通過-o指定輸出文件格式:
# json格式,默認(rèn)為Unicode編碼
scrapy crawl itcast -o itcast.json
# json lines格式,默認(rèn)為Unicode編碼
scrapy crawl itcast -o itcast.jsonl
#csv 逗號(hào)表達(dá)式,可用Excel打開
scrapy crawl itcast -o itcast.csv
# xml格式
scrapy crawl itcast -o itcast.xml
執(zhí)行這些命令后,將會(huì)對(duì)爬取的數(shù)據(jù)進(jìn)行序列化,并生成文件。
編寫Item Pipeline(通用):
- 每個(gè)Item Pipeline都是實(shí)現(xiàn)了簡(jiǎn)單方法的Python類,他們接收到Item并通過它執(zhí)行一些行為,同時(shí)也決定此Item是丟棄還是被后續(xù)pipeline繼續(xù)處理。
- 每個(gè)item pipeline組件必須實(shí)現(xiàn)process_item(self,item,spider)方法:
這個(gè)方法必須返回一個(gè)Item (或任何繼承類)對(duì)象, 或是拋出 DropItem異常。
參數(shù)是被爬取的item和爬取該item的spider
spider程序每yield一個(gè)item,該方法就會(huì)被調(diào)用一次
- 同時(shí)還可以實(shí)現(xiàn)以下方法:
open_spider(self,spider):開啟spider的時(shí)候調(diào)用,只執(zhí)行1次
close_spider(self,spider):關(guān)閉spider的時(shí)候調(diào)用,只執(zhí)行1次
item寫入json文件:
import json
from itemadapter import ItemAdapter
class MyprojectPipeline:
def open_spider(self,spider):
'''可選實(shí)現(xiàn),開啟spider時(shí)調(diào)用該方法'''
self.f = open('itcast.json','w')
def process_item(self, item, spider):
'''必須實(shí)現(xiàn),被拋棄的item將不會(huì)被后續(xù)的pipeline組件所處理'''
self.f.write(json.dumps(dict(item),ensure_ascii=False)+'\n')
return item
def close_spider(self,spider):
'''可選實(shí)現(xiàn),關(guān)閉spider時(shí)調(diào)用該方法'''
self.f.close()
啟用Item Pipeline組件
ITEM_PIPELINES = {
'myProject.pipelines.MyprojectPipeline': 300,
}
在settings.py文件里添加以上配置(可以取消原有的注釋),后面的數(shù)字確定了item通過pipeline的順序,通常定義在0-1000范圍內(nèi),數(shù)值越低,組件的優(yōu)先級(jí)越高
啟動(dòng)爬蟲
查看當(dāng)前目錄下是否生成了itcast.json文件
4、Scrapy Shell
Scrapy終端是一個(gè)交互終端,我們可以在未啟動(dòng)spider的情況下嘗試及調(diào)試代碼,也可以用來測(cè)試XPath或CSS表達(dá)式,查看他們的工作方式,方便我們爬取的網(wǎng)頁(yè)中提取的數(shù)據(jù)。
啟動(dòng)scrapy shell
命令行啟動(dòng),url是要爬取的網(wǎng)頁(yè)的地址
常見可用對(duì)象
- response.status:狀態(tài)碼
- response.url:當(dāng)前頁(yè)面url
- response.body:響應(yīng)體(bytes類型)
- response.text:響應(yīng)文本(str類型)
- response.json():如果響應(yīng)體的是json,則直接轉(zhuǎn)換成python的dict類型
- response.headers:響應(yīng)頭
- response.selector:返回Selector對(duì)象,之后就可以調(diào)用xpath和css等方法,也可以簡(jiǎn)寫成response.xpath()和response.css()
selector選擇器
Selector有四個(gè)基本的方法,最常用的還是xpath:
Selector有四個(gè)基本的方法,最常用的還是xpath:
- xpath(): 傳入xpath表達(dá)式,返回該表達(dá)式所對(duì)應(yīng)的所有節(jié)點(diǎn)的selector list列表
- extract(): 序列化該節(jié)點(diǎn)為Unicode字符串并返回list
- css(): 傳入CSS表達(dá)式,返回該表達(dá)式所對(duì)應(yīng)的所有節(jié)點(diǎn)的selector list列表,語(yǔ)法同 BeautifulSoup4
- re(): 根據(jù)傳入的正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行提取,返回Unicode字符串list列表
5、Spider
Spider類定義了如何爬取某個(gè)(或某些)網(wǎng)站。包括了爬取的動(dòng)作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁(yè)的內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)(爬取item)。
scrapy.Spider是最基本的類,所有編寫的爬蟲必須繼承這個(gè)類。
import scrapy
class XxSpider(scrapy.Spider):
pass
主要用到的函數(shù)及調(diào)用順序?yàn)椋?/p>
- __init__():初始化爬蟲名字和start_urls列表
- start__requests(self):調(diào)用make_requests_from_url()生成Requests對(duì)象交給Scrapy下載并返回response
- parse(self,response):解析response,并返回Item或Requests(需指定回調(diào)函數(shù))。Item傳給Item pipline持久化 , 而Requests交由Scrapy下載,并由指定的回調(diào)函數(shù)處理(默認(rèn)parse()),一直進(jìn)行循環(huán),直到處理完所有的數(shù)據(jù)為止。
其他方法
log(self, message, level=log.DEBUG)
message:字符串類型,寫入的log信息
level:log等級(jí),有CRITICAL、 ERROR、WARNING、INFO、DEBUG這5種,默認(rèn)等級(jí)為DEBUG
6、CrwalSpider
快速創(chuàng)建CrawlSpider模板:
scrapy genspider -t crawl 爬蟲名 爬蟲域
scrapy.spiders.CrwalSpider是編寫的爬蟲所必須繼承的類
from scrapy.spiders import CrawlSpider
class XxSpider(CrawlSpider):
pass
CrawlSpider類繼承于Spider類,它定義了一些規(guī)則(rule)來提供跟進(jìn)link的方便的機(jī)制,從爬取的網(wǎng)頁(yè)中獲取link并繼續(xù)爬取的工作更適合。
LinkExtractor
class scrapy.spiders.LinkExtractor
- 每個(gè)LinkExtractor對(duì)象有唯一的公共方法是 extract_links(),它接收一個(gè)Response對(duì)象,并返回一個(gè) scrapy.link.Link 對(duì)象。根據(jù)不同的response調(diào)用多次來提取鏈接
- 主要參數(shù):
allow:滿足括號(hào)中“正則表達(dá)式”的值會(huì)被提取,如果為空,則全部匹配。
deny:與這個(gè)正則表達(dá)式(或正則表達(dá)式列表)匹配的URL一定不提取。
allow_domains:會(huì)被提取的鏈接的domains。
deny_domains:一定不會(huì)被提取鏈接的domains。
restrict_xpaths:使用xpath表達(dá)式,和allow共同作用過濾鏈接。
rules
class scrapy.spiders.Rule
在rules中包含一個(gè)或多個(gè)Rule對(duì)象,每個(gè)Rule對(duì)爬取網(wǎng)站的動(dòng)作定義了特定操作。如果多個(gè)rule匹配了相同的鏈接,第一個(gè)會(huì)被使用。
Rule對(duì)象主要參數(shù):
- link_extractor:是一個(gè)Link Extractor對(duì)象,用于定義需要提取的鏈接
- callback:從link_extractor中每獲取到鏈接時(shí),該回調(diào)函數(shù)接受一個(gè)response作為其第一個(gè)參數(shù)。注意:字符串類型,避免使用'parse'
- follow:布爾類型,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)。 如果callback為None,follow 默認(rèn)設(shè)置為True ,否則默認(rèn)為False。
- process_links:指定函數(shù),從link_extractor中獲取到鏈接列表時(shí)將會(huì)調(diào)用該函數(shù),主要用來過濾。
- process_requests:指定函數(shù), 該規(guī)則提取到每個(gè)request時(shí)都會(huì)調(diào)用該函數(shù),用來過濾request。
CrawSpider爬蟲示例
以陽(yáng)光熱線問政平臺(tái)http://wz.sun0769.com/political/index/politicsNewest?id=1為例,爬取投訴帖子的編號(hào)、帖子的標(biāo)題,帖子的處理狀態(tài)和帖子里的內(nèi)容。
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from myProject.items import MyprojectItem
class SunSpider(CrawlSpider):
name = 'sun'
allowed_domains = ['wz.sun0769.com']
start_urls = ['http://wz.sun0769.com/political/index/politicsNewest?id=1page=1']
rules = (
Rule(LinkExtractor(allow=r'id=\d+page=\d+')),#每一頁(yè)的匹配規(guī)則,callback為None,默認(rèn)跟進(jìn)
Rule(LinkExtractor(allow=r'politics/index\&;id=\d+'), callback='parse_item'),#每個(gè)帖子的匹配規(guī)則,設(shè)置了callback,默認(rèn)不跟進(jìn)
)
def parse_item(self, response):
item = MyprojectItem()
title = response.xpath('//div[@class="mr-three"]/p[@class="focus-details"]/text()').extract()[0] #帖子標(biāo)題
status = response.xpath('//div[@class="focus-date clear focus-date-list"]/span[3]/text()').extract()[0].split()[1] #處理狀態(tài)
number = response.xpath('//div[@class="focus-date clear focus-date-list"]/span[4]/text()').extract()[0].split(':')[-1] #帖子編號(hào)
content = response.xpath('//div[@class="details-box"]/pre/text()').extract()[0] #帖子內(nèi)容
item['title'] = title
item['status'] = status
item['number'] = number
item['content'] = content
yield item
7、logging功能
Scrapy提供了log功能,通過在setting.py中進(jìn)行設(shè)置,可以被用來配置logging
設(shè)置
- LOG_ENABLED:默認(rèn): True,啟用logging
- LOG_ENCODING:默認(rèn): 'utf-8',logging使用的編碼
- LOG_FILE:默認(rèn)::None,在當(dāng)前目錄里創(chuàng)建logging輸出文件的文件名
- LOG_LEVEL:默認(rèn):'DEBUG',有'CRITICAL'(嚴(yán)重錯(cuò)誤)、'ERROR'(一般錯(cuò)誤)、'WARNING'(警告信息)、'INFO'(一般信息)、'DEBUG'(調(diào)試信息)這5種等級(jí)
- LOG_STDOUT:默認(rèn): False 如果為 True,進(jìn)程所有的標(biāo)準(zhǔn)輸出(及錯(cuò)誤)將會(huì)被重定向到log中。
示例:
#在settings.py中任意位置添上以下兩句,終端上會(huì)清爽很多
LOG_FILE = "xxx.log"
LOG_LEVEL = "INFO"
8、Request對(duì)象
GET請(qǐng)求
- 可以使用yield scrapy.Request(url,callback)方法來發(fā)送請(qǐng)求
- Request對(duì)象初始化方法傳入?yún)?shù)如下:
class Request(object_ref):
def __init__(self, url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None, encoding='utf-8', priority=0,
dont_filter=False, errback=None, flags=None, cb_kwargs=None):
pass
主要參數(shù):
- url:需要請(qǐng)求并進(jìn)行下一步處理的url
- callback:指定該請(qǐng)求返回的Response,由哪個(gè)函數(shù)來處理
- method:默認(rèn)'GET',一般不需要指定,可以是‘POST','PUT'等
- headrs:請(qǐng)求時(shí)包含的頭文件,一般不需要
- meta:比較常用,在不同的request之間傳遞數(shù)據(jù)用的,dict類型
- encoding:使用默認(rèn)的‘utf-8'就行
- dont_filter:表明該請(qǐng)求不由調(diào)度器過濾,可以發(fā)送重復(fù)請(qǐng)求,默認(rèn)為False
- errback:指定錯(cuò)誤處理函數(shù)
POST請(qǐng)求
- 可以使用scrapy.FormRequest(url, formdata, callback)方法進(jìn)行發(fā)送
- 如果希望程序執(zhí)行一開始就發(fā)送POST請(qǐng)求,可以重寫Spider類的start_requests(self)方法,并且不再調(diào)用start_urls里的url。
- 如果想要預(yù)填充或重寫像用戶名、用戶密碼這些表單字段, 可以使用 scrapy.FormRequest.from_response(response, formdata, callback) 方法實(shí)現(xiàn)。
9、Downloader Middlewares(下載中間件)
下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個(gè)下載中間件被加載運(yùn)行。
當(dāng)引擎?zhèn)鬟f請(qǐng)求給下載器的過程中,下載中間件可以對(duì)請(qǐng)求進(jìn)行處理 (例如增加http header信息,增加proxy信息等);
在下載器完成http請(qǐng)求,傳遞響應(yīng)給引擎的過程中, 下載中間件可以對(duì)響應(yīng)進(jìn)行處理(例如進(jìn)行g(shù)zip的解壓等)
要激活下載器中間件組件,將其加入到settings.py中的DOWNLOADER_MIDDLEWARES 設(shè)置中。 該設(shè)置是一個(gè)字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。例如:
DOWNLOADER_MIDDLEWARES = {
'myProject.middlewares.MyprojectDownloaderMiddleware': 543,
}
中間件組件是一個(gè)定義了以下一個(gè)或多個(gè)方法的Python類:
- process_request(self, request, spider):當(dāng)每個(gè)request通過下載中間件時(shí),該方法被調(diào)用。
- process_response(self, request, response, spider):當(dāng)下載器完成http請(qǐng)求,傳遞響應(yīng)給引擎的時(shí)候調(diào)用
示例:(使用隨機(jī)User-Agent和代理IP)
middlewares.py文件
import random
import json
import redis
from scrapy import signals
from itemadapter import is_item, ItemAdapter
from myProject.settings import USER_AGENTS
class MyprojectDownloaderMiddleware:
def __init__(self):
self.r = redis.StrictRedis(host='localhost') #創(chuàng)建redis連接客戶端,用于取里面存儲(chǔ)的動(dòng)態(tài)獲取的代理ip
def process_request(self, request, spider):
user_agent = random.choice(USER_AGENTS) #取隨機(jī)user-Agent
proxy_list = json.loads(self.r.get('proxy_list').decode())
proxy = random.choice(proxy_list) #取隨機(jī)ip
request.headers.setdefault("User-Agent",user_agent) #設(shè)置user-agent
request.meta['proxy'] ='http://'+proxy['ip']+':'+str(proxy['port']) #使用代理ip
修改settings.py文件配置
#禁用cookies
COOKIES_ENABLED = False
#設(shè)置下載延遲
DOWNLOAD_DELAY = 3
#添加自己寫的下載中間件類
DOWNLOADER_MIDDLEWARES = {
'myProject.middlewares.MyprojectDownloaderMiddleware': 543,
}
#添加USER-AGENTS
USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
到此這篇關(guān)于Python爬蟲框架-scrapy的使用的文章就介紹到這了,更多相關(guān)Python爬蟲框架scrapy使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 上手簡(jiǎn)單,功能強(qiáng)大的Python爬蟲框架——feapder
- python爬蟲框架feapder的使用簡(jiǎn)介
- Python爬蟲框架之Scrapy中Spider的用法
- 一文讀懂python Scrapy爬蟲框架
- python Scrapy爬蟲框架的使用
- 詳解Python的爬蟲框架 Scrapy
- python3 Scrapy爬蟲框架ip代理配置的方法
- Python使用Scrapy爬蟲框架全站爬取圖片并保存本地的實(shí)現(xiàn)代碼
- Python爬蟲框架Scrapy實(shí)例代碼
- Python之Scrapy爬蟲框架安裝及簡(jiǎn)單使用詳解
- 爬蟲框架 Feapder 和 Scrapy 的對(duì)比分析