天天看點

scrapy爬蟲學習

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,如需轉載請自行聯系原作者