一文帶你了解Python 四種常見基礎爬蟲方法介紹
一、Urllib方法
Urllib是python內置的HTTP請求庫
import urllib.request#1.定位抓取的urlurl=’http://www.baidu.com/’#2.向目標url發送請求response=urllib.request.urlopen(url)#3.讀取數據data=response.read()# print(data) #打印出來的數據有ASCII碼print(data.decode(’utf-8’)) #decode將相應編碼格式的數據轉換成字符串
#post請求import urllib.parseurl=’http://www.iqianyue.com/mypost/’#構建上傳的datapostdata=urllib.parse.urlencode({ ’name’:’Jack’, ’pass’:’123456’}).encode(’utf-8’) #字符串轉化成字節流數據html=urllib.request.urlopen(url,data=postdata).read()print(html)
#headers針對檢驗頭信息的反爬機制import urllib.requestheaders={’User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36’}request1=urllib.request.Request(’https://www.dianping.com/’,headers=headers)#Request類構建了一個完整的請求response1=urllib.request.urlopen(request1).read()print(response1.decode(’utf-8’))
#超時設置+異常處理import urllib.requestimport urllib.errorfor i in range(20): try: response1=urllib.request.urlopen(’http://www.ibeifeng.com/’,timeout=0.01) print(’a’) except urllib.error.URLError as e: print(e) except BaseException as a: #所有異常的基類 print(a)
二、requests方法
?Requests是用python語言基于urllib編寫的,采用的是Apache2 Licensed開源協議的HTTP庫?urllib還是非常不方便的,而Requests它會比urllib更加方便,可以節約我們大量的工作。?requests是python實現的最簡單易用的HTTP庫,建議爬蟲使用requests庫。?默認安裝好python之后,是沒有安裝requests模塊的,需要單獨通過pip安裝
import requests#get請求r=requests.get(’https://www.taobao.com/’)#打印字節流數據# print(r.content)# print(r.content.decode(’utf-8’)) #轉碼print(r.text) #打印文本數據import chardet#自動獲取到網頁編碼,返回字典類型print(chardet.detect(r.content))
POST請求實現模擬表單登錄import requests#構建上傳到網頁的數據data={ ’name’:’Jack’, ’pass’:’123456’}#帶登陸數據發送請求r=requests.post(’http://www.iqianyue.com/mypost/’,data=data)print(r.text) #打印請求數據#將登錄后的html儲存在本地f=open(’login.html’,’wb’)f.write(r.content) #寫入字節流數據f.close()
#針對檢驗頭信息的反爬機制headersimport requests#構建headersheaders={ ’User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36’}r=requests.get(’https://www.dianping.com/’,headers=headers)print(r.text)print(r.status_code) #狀態403 被攔截了(查看狀態)
#cookies#跳過登陸,獲取資源import requestsf=open(’cookie.txt’,’r’) #打開cookie文件#初始化cookies,聲明一個空字典cookies={}#按照字符 ; 進行切割讀取,返回列表數據,然后遍歷#split():切割函數 strip()去除字符串前后空白for line in f.read().split(’;’): #split將參數設置為1,把字符串切割成兩個部分 name,value=line.strip().split(’=’,1) #為空字典cookies添加內容 cookies[name]=valuer=requests.get(’http://www.baidu.com’,cookies=cookies)data=r.textf1=open(’baidu.html’,’w’,encoding=’utf-8’)f1.write(data)f1.close()
#設置代理(網站搜索免費代理ip)#解決網頁封IP的問題import requestsproxies={ #’協議’:’ip:端口號’ ’HTTP’:’222.83.160.37:61205’}req=requests.get(’http://www.taobao.com/’,proxies=proxies)print(req.text)#設置超時import requestsfrom requests.exceptions import Timeouttry: response = requests.get('http://www.ibeifeng.com ', timeout=0.01) print(response.status_code)except Timeout: print(’訪問超時!’)
三、BS4- BeautifulSoup4解析
from bs4 import BeautifulSouphtml = '''<html><head><title>The Dormouse’s story</title></head><body><p class='title'><b>The Dormouse’s story</b></p><p class='story'>Once upon a time there were three little sisters; and their names were<a rel='external nofollow' rel='external nofollow' id='link1'>Elsie</a>,<a rel='external nofollow' id='link2'>Lacie</a> and<a rel='external nofollow' id='link3'>Tillie</a>;and they lived at the bottom of a well.</p><p class='story'>...</p>'''# #創建一個BS對象soup=BeautifulSoup(html,’html.parser’) #html.parser默認解析器print(type(soup))# 結構化輸出print(soup.prettify())#1獲取標簽(只能獲取第一條對應的標簽)print(soup.p) #獲取p標簽print(soup.a) #獲取a標簽print(soup.title) #獲取title#2獲取標簽內容print(soup.title.string)print(soup.a.string)print(soup.body.string) #如果標簽中有多個子標簽返回Noneprint(soup.head.string) #如果標簽中有一個子標簽返回子標簽里的文本#3獲取屬性print(soup.a.attrs) #返回字典print(soup.a[’id’]) #得到指定屬性值#4操作字節點print(soup.p.contents) #得到標簽下所有子節點print(soup.p.children) #得到標簽下所有子節點的迭代對象#5操作父節點print(soup.p.parent) #得到標簽p的父節點其內部的所有內容print(soup.p.parents) # 得到標簽p的父節點的迭代對象#6操作兄弟節點(同級的節點)#next_sibling和previous_sibling分別獲取節點的下一個和上一個兄弟元素print(soup.a.next_sibling)print(soup.a.previous_sibling)#二.搜索文檔數#1標簽名#查詢所有a標簽res1=soup.find_all(’a’)print(res1)#獲取所有a標簽下屬性為class='sister'的標簽(#使用 class 做參數會導致語法錯誤,這里也要用class_)print(soup.find_all(’a’,class_='sister'))#2正則表達式import re#查詢所有包含d字符的標簽res2=soup.find_all(re.compile(’d+’))print(res2)#3列表#查找所有的title標簽和a標簽res3=soup.find_all([’title’,’a’])print(res3)#4關鍵詞#查詢屬性id=’link1’的標簽res4=soup.find_all(id=’link1’)print(res4)#5內容匹配res5=soup.find_all(text=’Tillie’) #文本匹配res55=soup.find_all(text=re.compile(’Dormouse’))print(res55)#6嵌套選擇print(soup.find_all(’p’))#查看所有p標簽下所有的a標簽for i in soup.find_all(’p’): print(i.find_all(’a’))#三.CSS選擇器#1根據標簽查詢對象res6=soup.select(’a’) #返回列表print(res6) #得到所有的a標簽#2根據ID屬性查詢標簽對象(id用#)print(soup.select(’#link2’))#3根據class屬性查詢標簽對象(class用.)print(soup.select(’.sister’))print(soup.select(’.sister’)[2].get_text()) #獲取文本內容#4屬性選擇(獲取a標簽里=href屬性值的標簽)print(soup.select(’a[ rel='external nofollow' rel='external nofollow' ]’))#5包含選擇(獲取)print(soup.select(’p a#link1’))#6并列選擇print(soup.select(’a#link1,a#link2’))#7得到標簽內容res7=soup.select(’p a.sister’)for i in res7: print(i.get_text())
#練習:爬取51job主頁12個職位from bs4 import BeautifulSoupimport requestsurl=’https://www.51job.com/’headers={’User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36’}html=requests.get(url,headers=headers)data=html.content.decode(’gbk’)soup=BeautifulSoup(data,’html.parser’)#獲取span標簽,class_='at'屬性span=soup.find_all(’span’,class_='at')# for i in span:# print(i.get_text())#select方法(CSS選擇器)span1=soup.select(’span[class='at']’)for m in span1: print(m.get_text())
四、XPath語法
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷
from lxml import etreetext=’’’ <html> <head> <title>春晚</title> </head> <body> <h1 name='title'>個人簡介</h1> <div name='desc'> <p name='name'>姓名:<span>岳云鵬</span></p> <p name='addr'>住址:中國 河南</p> <p name='info'>代表作:五環之歌</p> </div>’’’#初始化html=etree.HTML(text)# result=etree.tostring(html) #字節流# print(result.decode(’utf-8’))#查詢所有的p標簽p_x=html.xpath(’//p’)print(p_x)#查詢所有p標簽的文本,用text只能拿到該標簽下的文本,不包括子標簽for i in p_x: print(i.text) #發現<span>沒有拿到#優化,用string()拿標簽內部的所有文本for i in p_x: print(i.xpath(’string(.)’))# 查詢所有name屬性的值attr_name=html.xpath(’//@name’)print(attr_name)#查詢出所有包含name屬性的標簽attr_name1=html.xpath(’//*[@name]’)print(attr_name1)
到此這篇關于一文帶你了解Python 四種常見基礎爬蟲方法介紹的文章就介紹到這了,更多相關Python 基礎爬蟲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章: