Python 爬虫初探(一)

背景:了解过Python基础语法,了解少许正则表达式,可以说约等于零基础了- -。这应该会是一个系列,相当于记录我学习爬虫相关技术知识的笔记,十分十分基础~~

语言:Python 3.6

环境:Win7

爬虫工作原理理解,将爬虫想象为一只在互联网上爬取信息的蜘蛛,首先初始化一个网页入口,程序获取将该网页的内容,识别出有用信息的链接(例如网易新闻排行榜主页中有用的信息则是各种类别的新闻)。然后将这些链接存储到队列中,由爬虫程序分别一个个进行网页信息抓取,直到将所有涉及到的网页信息都抓取到服务器中为止。

爬虫涉及的技术知识点目前了解到的有:

1、网页的抓取:GET/POST方式抓取网页、Cookie登录,遭遇反爬虫怎么处理、分布式爬虫、如何提高抓取效率;

2、内容的析取、存储;

好吧,暂时这么多,其实很多东西还没开始学,先记录一下第一个实现单个静态网页的抓取爬虫吧

1 #!/usr/bin/python3
2 
3 import requests
4 
5 start_url = "http://news.163.com/rank/"
6 contents = requests.get(start_url).content
7 fp = open("网易新闻排行榜.txt", "w+")
8 fp.write(contents.decode("gbk"))
View Code

需要使用requests库,Win7环境加载Python第三方库的方法,以requests为例:

下载 https://pypi.python.org/pypi/requests/#downloads 中这个文件,到本地将.whl后缀改为.zip后缀,解压后得

将图中第一个文件放到Python安装路径下的lib库文件夹中即可。这里吐槽一下不要用Python的IDLE工具编码,巨难用- -

fp.write(contents.decode("gbk"))

这句代码将抓取到的网易新闻排行榜页面写到文件中时进行转码是因为网页中包含中文的关系。

 

接下来是将该网页中所有的新闻子链接抓取出来,这段代码完全来自学习资料中的爬虫开源代码,我只有做注释

 1 #!/usr/bin/python3
 2 
 3 import os
 4 import re
 5 import requests
 6 from lxml import etree
 7 
 8 def Page_Info(myPage):
 9     '''Regex'''
10     # 这里的re.findall 返回的是一个元组列表,内容是 (.*?) 中匹配到的内容
11     # 析取每个链接的标题和链接
12     myPage_Info = re.findall(r'<div class="titleBar" id=".*?"><h2>(.*?)</h2><div class="more"><a href="(.*?)">.*?</a></div></div>',myPage,re.S)
13     return myPage_Info
14 
15 def StringListSave(save_path, filename, slist):
16     if not os.path.exists(save_path):
17         os.makedirs(save_path)
18     path = save_path + "/" + filename + ".txt"
19     with open(path, "w+") as fp:
20         for s in slist:
21             # 做了utf8转码,转为终端可识别的码制
22             fp.write("%s\t\t%s\n" % (s[0].encode("utf8"), s[1].encode("utf8")))
23             #fp.write("%s\t\t%s\n" % (s[0], s[1]))
24 
25 #测试new_page的内容    
26 def testNewPage(save_path, filename, new_page):
27     if not os.path.exists(save_path):
28         os.makedirs(save_path)
29     path = save_path + "/" + filename + ".txt"
30     fp = open(path, "w+")
31     fp.write(new_page)
32     
33 def New_Page_Info(new_page):
34     '''Regex(slowly) or Xpath(fast)'''
35     # new_page_info = re.findall(r'<td class=".*?">.*?<a href="(.*?)\.html.*?>(.*?)</a></td>',new_page,re.S)
36     # results = []
37     # for url, item in new_page_info:
38     #     results.append((item, url+".html"))
39     # return results
40 
41     #将new_page的内容转为html格式的树
42     dom = etree.HTML(new_page)
43     #析取 <tr <td <a中的文本
44     new_items = dom.xpath('//tr/td/a/text()')
45     #析取 <tr <td <a中的链接, @href 是一个属性
46     new_urls = dom.xpath('//tr/td/a/@href')
47     assert(len(new_items) == len(new_urls))
48     return zip(new_items, new_urls)
49 
50 
51 def Spider(url):
52     i = 0
53     print ("downloading ", url)
54     myPage = requests.get(url).content.decode("gbk")
55     myPageResults = Page_Info(myPage)
56     save_path = "网易新闻抓取"
57     filename = str(i)+"_网易新闻排行榜"
58     StringListSave(save_path, filename, myPageResults)
59     i += 1
60     for item, url in myPageResults:
61         print ("downloading", url)
62         new_page = requests.get(url).content.decode("gbk")
63         testNewPage(save_path, item, new_page)
64         newPageResults = New_Page_Info(new_page)
65         filename = str(i) + "_" + item
66         StringListSave(save_path, filename, newPageResults)
67         i += 1
68 
69 
70 if __name__ == '__main__':
71     print ("start")
72     start_url = "http://news.163.com/rank/"
73     Spider(start_url)
74     print ("end")
View Code

值得注意的是 使用xpath 比 使用re.findall在抓取效率上高了不少。

 

学习以及翻阅的资料:

爬虫开源代码:https://github.com/lining0806

Python语法基础:http://www.runoob.com/python/python-tutorial.html

正则表达式语法基础:http://www.runoob.com/regexp/regexp-syntax.html

lxml学习文档:http://lxml.de/tutorial.html

XPath讲解:http://blog.csdn.net/raptor/article/details/451644

XPath官网文档:https://www.w3.org/TR/xpath/

posted @ 2017-02-26 16:33  Sawako  阅读(678)  评论(0编辑  收藏  举报