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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<code>urllib子產品解析編碼url參數</code>
<code>from</code> <code>urllib </code><code>import</code> <code>parse</code>
<code>postdata </code><code>=</code> <code>{</code>
<code> </code><code>'a'</code><code>: </code><code>1</code><code>,</code>
<code> </code><code>'b'</code><code>: </code><code>2</code>
<code>}</code>
<code>data </code><code>=</code> <code>parse.urlencode(postdata)</code>
<code>print</code><code>(data)</code>
<code>windows下爬蟲腳本必須配置以下内容,否則出現編碼錯誤</code>
<code>import</code> <code>sys,io</code>
<code>sys.stdout</code><code>=</code><code>io.TextIOWrapper(sys.stdout.</code><code>buffer</code><code>,encoding</code><code>=</code><code>'gb18030'</code><code>)</code>
<code>一、爬取煎蛋網内容</code>
<code>items.py </code><code>#資料字段</code>
<code>import</code> <code>scrapy</code>
<code>class</code> <code>JiandanItem(scrapy.Item):</code>
<code> </code><code># define the fields for your item here like:</code>
<code> </code><code># name = scrapy.Field()</code>
<code> </code><code>title </code><code>=</code> <code>scrapy.Field()</code>
<code> </code><code>content </code><code>=</code> <code>scrapy.Field()</code>
<code> </code><code>img_url </code><code>=</code> <code>scrapy.Field()</code>
<code> </code>
<code>爬蟲腳本jiandan.py</code>
<code>from</code> <code>..items </code><code>import</code> <code>JiandanItem</code>
<code>from</code> <code>scrapy.selector </code><code>import</code> <code>HtmlXPathSelector</code>
<code>class</code> <code>JianDanSpider(scrapy.Spider):</code>
<code> </code><code>name </code><code>=</code> <code>"jiandan"</code>
<code> </code><code>allowed_domains </code><code>=</code> <code>[</code><code>"jandan.net"</code><code>]</code>
<code> </code><code>start_urls </code><code>=</code> <code>[</code>
<code> </code><code>"http://jandan.net/"</code><code>,</code>
<code> </code><code>]</code>
<code> </code><code>def</code> <code>parse(</code><code>self</code><code>, response):</code>
<code> </code><code>#title_list = response.xpath('//div[@class="indexs"]//h2/a/text()').extract()</code>
<code> </code><code>hxs </code><code>=</code> <code>HtmlXPathSelector(response)</code>
<code> </code><code>items </code><code>=</code> <code>hxs.select(</code><code>'//div[@class="post f list-post"]'</code><code>)</code>
<code> </code><code>for</code> <code>item </code><code>in</code> <code>items:</code>
<code> </code><code>img_url </code><code>=</code> <code>item.select(</code><code>'.//div[@class="thumbs_b"]/a/img/@data-original'</code><code>).extract_first()</code>
<code> </code><code>if</code> <code>not</code> <code>img_url:</code>
<code> </code><code>img_url </code><code>=</code> <code>item.select(</code><code>'.//div[@class="thumbs_b"]/a/img/@src'</code><code>).extract_first()</code>
<code> </code><code>img_url </code><code>=</code> <code>img_url.strip(</code><code>"/"</code><code>)</code>
<code> </code><code>img_url </code><code>=</code> <code>"http://"</code><code>+</code><code>img_url</code>
<code> </code><code>title </code><code>=</code> <code>item.select(</code><code>'.//div[@class="indexs"]/h2/a/text()'</code><code>).extract_first()</code>
<code> </code><code>content </code><code>=</code> <code>item.select(</code><code>'.//div[@class="indexs"]/text()'</code><code>).extract()[</code><code>3</code><code>]</code>
<code> </code><code>content </code><code>=</code> <code>content.strip()</code>
<code> </code><code>obj </code><code>=</code> <code>JiandanItem(title</code><code>=</code><code>title, img_url</code><code>=</code><code>img_url, content</code><code>=</code><code>content)</code>
<code> </code><code>yield</code> <code>obj</code>
<code> </code>
<code> </code><code>pipelines.py</code><code>#資料存儲腳本</code>
<code> </code><code>import</code> <code>json</code>
<code>import</code> <code>os</code>
<code>import</code> <code>requests</code>
<code># class JiandanPipeline(object):</code>
<code># def process_item(self, item, spider):</code>
<code># return item</code>
<code>class</code> <code>JsonPipeline(</code><code>object</code><code>): </code><code>#items.py設定的字段存儲方式</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>self</code><code>.</code><code>file</code> <code>=</code> <code>open</code><code>(</code><code>'jiandan.txt'</code><code>, </code><code>'w'</code><code>)</code>
<code> </code><code>def</code> <code>process_item(</code><code>self</code><code>, item, spider):</code>
<code> </code><code>v </code><code>=</code> <code>json.dumps(</code><code>dict</code><code>(item), ensure_ascii</code><code>=</code><code>False</code><code>)</code>
<code> </code><code>self</code><code>.</code><code>file</code><code>.write(v)</code>
<code> </code><code>self</code><code>.</code><code>file</code><code>.write(</code><code>'\n'</code><code>)</code>
<code> </code><code>self</code><code>.</code><code>file</code><code>.flush()</code>
<code> </code><code>return</code> <code>item</code>
<code>class</code> <code>FilePipeline(</code><code>object</code><code>): </code><code>#圖檔url存儲方式</code>
<code> </code><code>if</code> <code>not</code> <code>os.path.exists(</code><code>'imgs'</code><code>):</code>
<code> </code><code>os.makedirs(</code><code>'imgs'</code><code>)</code>
<code> </code><code>response </code><code>=</code> <code>requests.get(item[</code><code>'img_url'</code><code>],stream</code><code>=</code><code>True</code><code>)</code>
<code> </code><code>with </code><code>open</code><code>(</code><code>'1.jpg'</code><code>, mode</code><code>=</code><code>'wb'</code><code>) as f:</code>
<code> </code><code>f.write(response.content)</code>
<code> </code>
<code>settings.py</code><code>#設定存儲</code>
<code>ITEM_PIPELINES </code><code>=</code> <code>{</code>
<code> </code><code>'jiandan.pipelines.JsonPipeline'</code><code>: </code><code>100</code><code>,</code>
<code> </code><code>'jiandan.pipelines.FilePipeline'</code><code>: </code><code>300</code><code>,</code>
<code>指令行輸出json檔案: scrapy crawl jiandan </code><code>-</code><code>o items.json</code>
本文轉自小白的希望 51CTO部落格,原文連結:http://blog.51cto.com/haoyonghui/1976840,如需轉載請自行聯系原作者