使用Pycharm寫一個網絡爬蟲


在初步了解網絡爬蟲之后,我們接下來就要動手運用Python來爬取網頁了。

我們知道,網絡爬蟲應用一般分為兩個步驟:

  1.通過網頁鏈接獲取內容;

  2.對獲得的網頁內容進行處理

這兩個步驟需要分別使用不同的函數庫:requestsbeautifulsoup4。所以我們要安裝這兩個第三方庫。

 

我所用的編輯器是 Pycharm,它帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具,比如調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成等。本次安裝第三方庫是在Pycharm下進行安裝的。

Pychram安裝第三方庫:

安裝第三方庫有很多方法,我這里用的是Pycharm自帶功能進行下載安裝:(當然也可以用pip方法進行安裝)

打開:File→Settings→Project: cc(這里的文件名是cc)→Project Interpreter ,就會顯示你已經安裝好的庫。

這里我已經安裝好了requests和beautifulsoup4庫,所以下圖顯示出來了。

 

 點擊“+”,在彈出的搜索框中輸入要安裝第三方庫的名稱,例如“requests”。

 

在彈出的選項中選中需要安裝的庫后,點擊“Install Package”。待下載完成后就安裝成功了。

同理,安裝beautifulsoup4時,在搜索框里搜索“beautifulsoup4”,進行安裝就可以了、

 

下面介紹一下第三方庫:

requests庫

  requests庫是一個簡潔且簡單的處理HTTP請求的第三方庫,它的最大優點是程序編寫過程更接近正常URL訪問過程。這個庫建立在Python語言的urllib3庫的基礎上,類似這種在其他函數庫之上再封裝功能、提供更友好函數的方式在Python 語言中十分常見。

requests庫支持非常豐富的鏈接訪問功能,包括國際域名和URL獲取、HTTP長連接和連接緩存、HTTP會話和Cookie保持、瀏覽器使用風格的SSL驗證、基本的摘要認證、有效的鍵值對Cookie記錄、自動解壓縮、自動內容解碼、文件分塊上傳、HTTP(S)代理功能、連接超時處理、流數據下載等。

如何使用requests庫?requests庫提供了一些常用函數如下:

  requests庫中的網頁請求函數

函數 描述
get(url, [timeout=n]) 對應於HTTP的GRT方式,獲取網頁最常用的方法,可以增加timeout=n參數,設定每次請求超時時間為n秒
post(url,data={''key}:''value) 對應於HTTP的DELETE方式
delete(url) 對應於HTTP的HEAD方式
head(url) 對應於HTTP的HEAD方式
option(url) 對應於HTTP的OPTION方式
put(url,data={'key':'value'}) 對應於HTTP的PUT方式,其中字典用於傳遞客戶數據

 一般運用這些函數的方法是requests.函數名(),不同的函數有不同的功能。

import requests
r=requests.get("http://www.baidu.com/")
r.encoding="utf-8"  #編碼方式為utf-8,不加的話會出現中文亂碼
print(r.text)

代碼運行結果為:

 

 

和瀏覽器的交互過程一樣,用requests.get()代表請求,它返回的Response代表響應。返回的內容作為一個對象更便於操作,下面是Response對象的屬性

Response對象的屬性

屬性 描述
status_code HTTP請求的返回狀態,整數,200表示連接成功,404表示失敗
text HTTP響應內容的字符串形式,即url對應的頁面內容
encoding HTTP響應內容的編碼方式
content HTTP響應內容的二進制形式
import requests
r=requests.get("http://www.baidu.com/")

print(r.status_code)
print(r.text)
print(r.encoding)
print(r.content)

運行結果如下,可以看到爬取網頁的一系列信息。

 

 

 Response對象還有一些方法。

Response對象的方法

方法 描述
json() 如果HTTP響應內容包括JSON格式數據,則該方法解析JSON數據
raise_for_status() 如果不是200,則產生異常

 

 

使用requests 庫獲取HTML頁面並將其轉換成字符串后,需要進一步解析HTML頁面格式,提取有用信息,這需要處理HTML和XML的函數庫。

beautifulsoup4庫

  beautifulsoup4庫,也稱為Beautiful Soup 庫或bs4庫,用於解析和處理HTML和XML。需要注意的是,它不是BeautifulSoup庫。它的最大優點是能根據HTML和XML語法建立解析樹,進而高效解析其中的內容。

  HTML建立的Web頁面一般非常復雜, 除了有用的內容信息外,還包括大量用於頁面格式的元素,直接解析一個Web網頁需要深入了解HTML語法,而且比較復雜。beautifulsoup4 庫將專業的Web頁面格式解析部分封裝成函數,提供了若干有用且便捷的處理函數。

  beautifulsoup4庫采用面向對象思想實現,簡單地說,它把每個頁面當作一個對象,通過<a>.<b>的方式調用對象的屬性(即包含的內容),或者通過<a>.<b>0的方式調用方法(即處理函數)。在使用beautifulsoup4庫之前,需要進行引用,由於這個庫的名字非常特殊且采用面向對象方式組織,可以用from-import方式從庫中直接引用BeautifulSoup 類。

例如:

from bs4 import BeautifulSoup

HTML中主要結構都變成了BeautifulSoup對象的一個屬性,可以通過<a>.<b>獲得,下面是BeautifulSoup中常用的一些屬性:

BeautifulSoup對象的常用屬性

屬性 描述
head HTML頁面的<head>內容
title HTML頁面標題,在<head>之中,由<title>標記
body HTML頁面的<body>內容
p HTML頁面中第一個<p>內容
strings HTML頁面所有呈現在Web上的字符串,即標簽上的內容
stripped_strings HTML頁面所有呈現在Web上的非空格字符串

 

import requests
from bs4 import BeautifulSoup
r=requests.get("http://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)

print(soup.head)
print(soup.title)
print(soup.strings)

結果如下:

 

BeautifulSoup屬性與HTML屬性的標簽名稱相同。每一個Tag標簽在beautifulsoup4庫中也是一個對象,成為Tag對象。所以可以通過Tag對象的屬性多的相應的內容,Tag對象的屬性如下所示:

標簽對象的常用屬性

屬性 描述
name 字符串,標簽的名字,比如div
attrs 字典,包含了原來頁面Tag所有的屬性,比如href
contents 列表,這個Tag下所有子Tag的內容
string 字符串,Tag所包圍的文本,網頁中真實的文字
import requests
from bs4 import BeautifulSoup
r=requests.get("http://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)

print(soup.a)
print(soup.a.string)

結果如下:

 

 

 

 由於HTML語法可以在標簽中嵌套其他標簽,所以,string 屬性的返回值遵循如下原則。

  (1)如果標簽內部沒有其他標簽,string 屬性返回其中的內容。  

  (2)如果標簽內部還有其他標簽,但只有一個標簽,string 屬性返回最里面標簽的內容。  

  (3)如果標簽內部有超過1層嵌套的標簽,string 屬性返回None (空字符串)。HTML語法中同一個標簽會有很多內容,例如<a>標簽,百度首頁一共有13處,直接調用soup.a只能返回第一個。

 

 遇到的問題:

1.在Pycharm使用Python爬取網頁時,爬取的網頁源碼顯示在一行,網頁源碼沒有換行。

例如:

import requests
r=requests.get("http://www.baidu.com/")
r.encoding="utf-8"
print(r.text)

運行上述代碼,你會發現你爬取的網頁源碼顯示在一行內。

 

 

 

 解決辦法:點擊箭頭所指的按鈕,控制台就會自動換行了。

 

 

 

2.Pycharm在安裝好第三方庫時,在新建一個項目時,你會發現之前已經安裝的第三方庫不能使用。

新建一個項目,你會發現它沒有之前安裝的第三方庫了

 

 這時,你可以點擊下拉框,再在下拉框中選擇“show all”

 

這時,你可以找到上一個你已經安裝好第三方庫的項目,選中然后確認

 

 

 再點擊確定

 

 

 然后運行代碼,你就會發現可以使用第三方庫了

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM