初識Python和使用Python爬蟲

 一.python基礎知識瞭解:
 
1.特色:
Python的語言特性:
Python是一門具備強類型(即變量類型是強制要求的)、動態性、隱式類型(不須要作變量聲明)、大小寫敏感(var和VAR表明了不一樣的變量)以及面向對象(一切皆爲對象)等特色的編程語言。
優勢:
  容易上手,代碼簡潔,代碼量小,編寫快速,三方庫成熟
缺點:
  第一個缺點就是運行速度慢,和C程序相比很是慢,由於Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程很是耗時,因此很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,因此很是快。
  第二個缺點就是代碼不能加密。若是要發佈你的Python程序,實際上就是發佈源代碼,這一點跟C語言不一樣,C語言不用發佈源代碼,只須要把編譯後的機器碼(也就是你在Windows上常見的xxx.exe文件)發佈出去。要從機器碼反推出C代碼是不可能的,因此,凡是編譯型的語言,都沒有這個問題,而解釋型的語言,則必須把源碼發佈出去。
 
2.python能作什麼:
  • 網絡應用:包括網站、後臺服務等等,構建網絡應用通常使用Django 或者 Flask這倆相對流行的框架。
  • 數據科學:包括機器學習(scikit-learn和TensorFlow)、數據分析和數據可視化(Matplotlib)
  • 腳本、爬蟲
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)
python中使用#來表示註釋
當語句以冒號:結尾時,縮進的語句視爲代碼塊。
縮進有利有弊。好處是強迫你寫出格式化的代碼,但沒有規定縮進是幾個空格仍是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用途普遍,能夠用於數據挖掘、監測和自動化測試。
2) 安裝 scrapy框架
 
3) 構建scrapy框架項目
 
4) 初始化一個spider 叫作movie 針對主機名是「douban.com」
 
這時一個基本的Python爬蟲框架就完成了,這裏會根據模板生成一套代碼
 
 
scrapy.cfg:配置文件
spiders:存放你Spider文件,也就是你爬取的py文件
items.py:至關於一個容器,和字典較像
middlewares.py:定義Downloader Middlewares(下載器中間件)和Spider Middlewares(蜘蛛中間件)的實現
pipelines.py:定義Item Pipeline的實現,實現數據的清洗,儲存,驗證。
settings.py:全局配置
此時scrapy基本功能構建完成,須要進行目標功能構建
 
5)建立一個spider文件:
這裏以動漫觀看排行榜的數據爲例子
#爬蟲類
 
#數據item
 
#pipeline後處理類
 
 
5)執行寫好的爬蟲,獲得數據
scrapy crawl agefans --nolog
 
6)結果:
 
 
6.解析庫
1)lxml的使用
使用pip3 install lxml安裝庫
XPath的經常使用規則:
  • / 表示選取直接子節點
  • // 表示選取全部子孫節點
  • . 選取當前節點
  • .. 選取當前結點的父節點
  • @ 選取屬性
 
仍是拿上面的解析方法來舉例:
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'
 
 
2.2獲取屬性值
好比,咱們想要獲取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分別爲下一個兄弟節點,上一個兄弟節點,上面全部的兄弟節點,下面全部的兄弟節點。
 
2.4獲取文本屬性
string爲獲取文本
attrs爲獲取屬性
 
2.5方法選擇器
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()只返回一個值,匹配到符合要求的第一個值。用法和上面的方法同樣
 
解析結果:
 
 by 張軼
相關文章
相關標籤/搜索