原文地址:http://www.javashuo.com/article/p-oynrvgpi-g.htmlhtml
github地址:https://github.com/zhu-xb/scrapy-movie-demogit
Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 其能夠應用在數據挖掘,信息處理或存儲歷史數據等一系列的程序中。其最初是爲了頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。github
Scrapy 使用了 Twisted異步網絡庫來處理網絡通信。總體架構大體以下windows
Scrapy主要包括瞭如下組件:網絡
Scrapy運行流程大概以下:架構
1、安裝併發
pip install Scrapy
注:windows平臺須要依賴pywin32,請根據本身系統32/64位選擇下載安裝,https://sourceforge.net/projects/pywin32/框架
2、爬蟲舉例 dom
入門篇:美劇天堂前100最新(http://www.meijutt.com/new100.html)異步
一、建立工程
scrapy startproject movie
二、建立爬蟲程序
cd movie
scrapy genspider meiju meijutt.com
三、自動建立目錄及文件
四、文件說明:
注意:通常建立爬蟲文件時,以網站域名命名
五、設置數據存儲模板
items.py
import scrapy class MovieItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field()
六、編寫爬蟲
meiju.py
# -*- coding: utf-8 -*- import scrapy from movie.items import MovieItem class MeijuSpider(scrapy.Spider): name = 'meiju' allowed_domains = ['meijutt.com'] start_urls = ['http://meijutt.com/'] def parse(self, response): movies = response.xpath('//div[@class="list_2"]/ul/li') for each_movie in movies: item = MovieItem() item['name'] = each_movie.xpath('./a/@title').extract()[0] yield item
七、設置配置文件
settings.py增長以下內容
ITEM_PIPELINES = {'movie.pipelines.MoviePipeline':100}
八、編寫數據處理腳本
pipelines.py
class MoviePipeline(object): def process_item(self, item, spider): with open("my_meiju.txt",'a') as fp: fp.write(item['name'].encode("utf8") + '\n')
九、執行爬蟲
scrapy crawl meiju --nolog
十、結果
進階篇:爬取校花網(http://www.xiaohuar.com/list-1-1.html)
一、建立一個工程
1
|
scrapy startproject pic
|
二、建立爬蟲程序
1
2
|
cd pic
scrapy genspider xh xiaohuar.com
|
三、自動建立目錄及文件
四、文件說明:
注意:通常建立爬蟲文件時,以網站域名命名
五、設置數據存儲模板
1
2
3
4
5
6
7
8
|
import scrapy
class
PicItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
addr = scrapy.Field()
name = scrapy.Field()
|
六、編寫爬蟲
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# -*- coding: utf-8 -*-
import scrapy
import os
# 導入item中結構化數據模板
from
pic.items import PicItem
class
XhSpider(scrapy.Spider):
# 爬蟲名稱,惟一
name =
"xh"
# 容許訪問的域
allowed_domains = [
"xiaohuar.com"
]
# 初始URL
start_urls = [
'http://www.xiaohuar.com/list-1-1.html'
]
def parse(self, response):
# 獲取全部圖片的a標籤
allPics = response.xpath(
'//div[@class="img"]/a'
)
for
pic
in
allPics:
# 分別處理每一個圖片,取出名稱及地址
item = PicItem()
name = pic.xpath(
'./img/@alt'
).extract()[0]
addr = pic.xpath(
'./img/@src'
).extract()[0]
addr =
'http://www.xiaohuar.com'
+addr
item[
'name'
] = name
item[
'addr'
] = addr
# 返回爬取到的數據
yield item
|
七、設置配置文件
1
2
|
# 設置處理返回數據的類及執行優先級
ITEM_PIPELINES = {
'pic.pipelines.PicPipeline'
:100}
|
八、編寫數據處理腳本
1
2
3
4
5
6
7
8
9
10
11
|
import urllib2
import os
class
PicPipeline(
object
):
def process_item(self, item, spider):
headers = {
'User-Agent'
:
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'
}
req = urllib2.Request(url=item[
'addr'
],headers=headers)
res = urllib2.urlopen(req)
file_name = os.path.
join
(r
'D:\my\down_pic'
,item[
'name'
]+
'.jpg'
)
with open(file_name,
'wb'
)
as
fp:
fp.write(res.read())
|
九、執行爬蟲
1
2
|
cd pic
scrapy crawl xh --nolog
|
結果:
終極篇:我想要全部校花圖
註明:基於進階篇再修改成終極篇
# xh.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# -*- coding: utf-8 -*-
import scrapy
import os
from
scrapy.http import Request
# 導入item中結構化數據模板
from
pic.items import PicItem
class
XhSpider(scrapy.Spider):
# 爬蟲名稱,惟一
name =
"xh"
# 容許訪問的域
allowed_domains = [
"xiaohuar.com"
]
# 初始URL
start_urls = [
'http://www.xiaohuar.com/hua/'
]
# 設置一個空集合
url_set =
set
()
def parse(self, response):
# 若是圖片地址以http://www.xiaohuar.com/list-開頭,我才取其名字及地址信息
if
response.url.startswith(
"http://www.xiaohuar.com/list-"
):
allPics = response.xpath(
'//div[@class="img"]/a'
)
for
pic
in
allPics:
# 分別處理每一個圖片,取出名稱及地址
item = PicItem()
name = pic.xpath(
'./img/@alt'
).extract()[0]
addr = pic.xpath(
'./img/@src'
).extract()[0]
addr =
'http://www.xiaohuar.com'
+addr
item[
'name'
] = name
item[
'addr'
] = addr
# 返回爬取到的信息
yield item
# 獲取全部的地址連接
urls = response.xpath(
"//a/@href"
).extract()
for
url
in
urls:
# 若是地址以http://www.xiaohuar.com/list-開頭且不在集合中,則獲取其信息
if
url.startswith(
"http://www.xiaohuar.com/list-"
):
if
url
in
XhSpider.url_set:
pass
else
:
XhSpider.url_set.add(url)
# 回調函數默認爲parse,也能夠經過from scrapy.http import Request來指定回調函數
# from scrapy.http import Request
# Request(url,callback=self.parse)
yield self.make_requests_from_url(url)
else
:
pass
|