1.特色:
Python是一門具備強類型(即變量類型是強制要求的)、動態性、隱式類型(不須要作變量聲明)、大小寫敏感(var和VAR表明了不一樣的變量)以及面向對象(一切皆爲對象)等特色的編程語言。
容易上手,代碼簡潔,代碼量小,編寫快速,三方庫成熟
第一個缺點就是運行速度慢,和C程序相比很是慢,由於Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程很是耗時,因此很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,因此很是快。
第二個缺點就是代碼不能加密。若是要發佈你的Python程序,實際上就是發佈源代碼,這一點跟C語言不一樣,C語言不用發佈源代碼,只須要把編譯後的機器碼(也就是你在Windows上常見的xxx.exe文件)發佈出去。要從機器碼反推出C代碼是不可能的,因此,凡是編譯型的語言,都沒有這個問題,而解釋型的語言,則必須把源碼發佈出去。
2.python能作什麼:
3.python的版本問題:
目前,Python有兩個版本,一個是2.x版,一個是3.x版,這兩個版本是不兼容的(語法發生改變)。因爲3.x版愈來愈普及,因此直接使用3.x版本
4.hello world:
print("hello world")
5.一段簡單的代碼:
# 這是一行註釋 a = 100 if a >= 0: print(a) else: print(-a)
縮進有利有弊。好處是強迫你寫出格式化的代碼,但沒有規定縮進是幾個空格仍是Tab。按照約定俗成的管理,應該始終堅持使用4個空格的縮進。
縮進的另外一個好處是強迫你寫出縮進較少的代碼,你會傾向於把一段很長的代碼拆分紅若干函數,從而獲得縮進較少的代碼。
二.python爬蟲:
1.什麼是爬蟲(spider):
爬蟲(spider)的本質是一個向網站或URL發送請求, 獲取資源後分析並提取有用數據的應用程序。它能夠用來獲取文本數據,也能夠用來下載圖片或音樂,還能夠用來搶票。各大IT公司如阿里, 百度, 新浪和今日頭條都大規模的應用了爬蟲技術。好比阿里雲網站上的IT技術類文章都是從CSDN, CNBlogs和微信公衆號等原創平臺上爬來的。新浪上的政府新聞不少也是直接從各大部委網站直接爬過來的。
2.爲何用python來寫爬蟲:
1)PHP語言 雖然是世界上最好的語言,可是他天生不是幹這個的,並且對多線程、異步支持不夠好,併發處理能力很弱。爬蟲是工具性程序,對速度和效率要求比較高。
2)Java 語言 Java 的網絡爬蟲生態圈也很完善,是Python爬蟲最大的對手。可是Java語言自己很笨重,代碼量很大。 重構成本比較高,任何修改都會致使代碼的大量變更。爬蟲常常須要修改部分採集代碼。
3)C/C++語言 運行效率和性能幾乎最強,可是學習成本很高,代碼成型比較慢,是很慢。 能用C/C++作爬蟲,只能說是能力的表現,可是不是正確的選擇。
4)Python 語言 語法優美、代碼簡潔、開發效率高、支持的模塊多,相關的HTTP請求模塊和HTML解析模塊很是豐富。 還有強大的爬蟲Scrapy框架,以及成熟高效的 scrapy-redis分佈式策略。並且,調用其餘語言的接口也很是方便(膠水語言)
關於scrapy-redis 引用這裏:https://www.cnblogs.com/pythoner6833/p/9148937.html
總結:各個語言都有辦法能寫爬蟲程序,只是python更加適合,並且有成熟的框架,寫起來比較簡單易上手
3.爬蟲的工做流程:
-
請求發送: 肯定須要爬取數據的目標url以及發送請求(request)時所須要攜帶的數據和各類HTTP頭部信息 (如user-agent, proxy IP, cookie)。發送請求時咱們最經常使用的有python 3自帶的urllib庫和須要安裝的第三方包requests庫。
-
數據解析: 對返回的數據(response)進行解析,提取咱們所須要的信息。經常使用的數據解析的庫有python自帶的html.parser, beautifulsoup(第三方庫)、lxml(第三方庫)。
-
數據存儲: 對第2步提取的數據咱們有時候須要對其進行清洗,有時會直接存入數據庫,寫入文件或緩存。
4.一個最簡單的爬蟲:
# 使用RequestsCookieJar來構建cookie
cookie_jar = RequestsCookieJar()
for k, v in d.items():
cookie_jar.set(k, v)
# 建立headers
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; Trident/7.0; rv:11.0) like Gecko'
header = {
"User-Agent": user_agent
}
1.使用requests建立請求
req = requests.get(url, headers=header, cookies=cookie_jar)
2.使用beautifulsoup來解析請求到的數據
if req.status_code == 200:
soup = bs(str(req.content, 'GBK'), 'html.parser')
3.soup中保存了方便解析的請求到的數據
result = soup.find_all('div', class_='paper-bt')[0].get_text()
4.對抓取到的數據保存或者輸出
print(result)
5.使用scrapy構建爬蟲
1) Scrapy是Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。
4) 初始化一個spider 叫作movie 針對主機名是「douban.com」
這時一個基本的Python爬蟲框架就完成了,這裏會根據模板生成一套代碼
spiders:存放你Spider文件,也就是你爬取的py文件
middlewares.py:定義Downloader Middlewares(下載器中間件)和Spider Middlewares(蜘蛛中間件)的實現
pipelines.py:定義Item Pipeline的實現,實現數據的清洗,儲存,驗證。
此時scrapy基本功能構建完成,須要進行目標功能構建
scrapy crawl agefans --nolog
6.解析庫
1)lxml的使用
-
/ 表示選取直接子節點
-
// 表示選取全部子孫節點
-
. 選取當前節點
-
.. 選取當前結點的父節點
-
@ 選取屬性
response.xpath('//li[@class="rank_text"]')
表明選取全部li標籤class屬性爲「rank_text」的子孫節點
2)BeautifulSoup的使用
使用 pip3 install BeautifulSoup安裝
soup = BeautifulSoup(str(req.content, 'utf-8'), 'lxml') 這裏是使用了lxml的解析器來解析,python自帶的解析器爲'html.parser'
好比,咱們想要獲取img的src屬性,咱們只須要,soup.img['src']就能夠獲取到,soup.img.arrts['src']也能夠獲取到。
若是想獲取到全部的屬性就這樣寫:soup.img.arrts便可
2.3獲取直接子節點和子孫節點,父節點,祖先節點,兄弟節點
-
獲取直接子節點:contents,例如我想獲取p標籤的直接子節點:soup.p.contents便可
-
獲取子孫節點:descendants,例如我想獲取p標籤的子孫節點:soup.p.descendants便可
-
獲取父節點:parent屬性,例如我想獲取p標籤的父節點:soup.p.parent便可
-
獲取祖先節點:parents屬性,例如我想獲取p標籤的祖先節點:soup.p.parents便可
-
獲取兄弟節點:next_sibling,previous_sibling,next_siblings,previous_siblings分別爲下一個兄弟節點,上一個兄弟節點,上面全部的兄弟節點,下面全部的兄弟節點。
find_all()返回的一個列表,匹配全部符合要求的元素
-
若是咱們想要獲取ul能夠這樣寫:soup.find_all(name='ul')
-
若是咱們想要獲取id爲id1屬性能夠這樣寫:soup.find_all(arrts[id='id1'])
-
若是咱們想要獲取class爲class1屬性能夠這樣寫:soup.find_all(arrts[class_='class1'])由於class有特殊意義,因此咱們獲取class的時候價格_便可
-
若是咱們想要獲取文本值能夠這樣寫:soup.find_all(text=re.compile(''))匹配text須要用到正則,匹配你想要的text值
-
find()只返回一個值,匹配到符合要求的第一個值。用法和上面的方法同樣