最近兩天看黑馬課程學習了一下爬蟲,總結一下吧

黑馬課程
一、理論
1、爬蟲的分類:
通用爬蟲:搜索引擎的爬蟲
聚焦爬蟲:針對特定網站的爬蟲
可以看出來了,我們一般用的都是聚焦爬蟲吧
2、聚焦爬蟲的作業流程:
(1)明確URL(請求地址,明確爬什么)
(2)發送請求,獲取回應資料
(3)保存相應資料,提取有用資訊
(4)處理資料(存盤、使用)
3、雙向爬取,
首先我們來熟悉兩個基礎技術名詞:橫向爬取 和縱向爬取,,
橫向爬取:所謂橫向爬取,是指在爬取的網站頁面中,以“頁”為單位,找尋該網站分頁器規律,一頁一頁的爬取網
站資料資訊,大多數網站,采用分頁管理模式,針對這類網站,首先要確立橫向爬取方法,,
縱向爬取:縱向爬取,是指在一個頁面內,按不同的“條目”為單位,找尋各條目之間的規律,一條一條的爬取一個
網頁中的資料資訊,也就是同時爬取一個頁面內不同類別資料,
二、
爬蟲由:
(1)發送請求,獲取回應——requests
(2)決議資料——beautifulsoup、re
(3)保存資料——json
<一>、requests(發送請求,獲取回應)
requests是一個簡單的pythonHTTP請求庫,requests的作用是發送請求獲取相應資料
##1.匯入模塊
import requests
##2.發送請求,獲取回應
response=requests.get('https://www.baidu.com/')
##3.獲取回應資料
#print(response.encoding)#ISO-8859-1
response.encoding='utf8'
#print(response.text)
print(response.content.decode(encoding='utf8'))
Response.encoding -編碼格式
Response.encoding-指定編碼格式
Response.text-按照指定編碼格式解碼輸出
可以把前兩個合并成一句Response.content.decode(encoding='gbk'),有的網頁不是utf-8,可以指定格式用來解碼,例gbk
response(回應)常見屬性:
response.text:回應體str型別
response.econding:二進制轉換字符使用的編碼
response.content:回應體bytes型別
<二>、BeautifulSoup
BeautifulSoup是一個可以從HTML或XML檔案中提取資料的python庫
<1>、安裝BeautifulSoup(用Spyder應該是不用安裝的)
pip install bs4
pip install lxml
<2>、BeautifulSoup物件:代表要決議整個檔案樹,它支持遍歷檔案樹和搜索檔案樹中描述的大部分的方法
<3>創建BeautifulSoup物件
#1、匯入模塊
from bs4 import BeautifulSoup
#2、創建BeautifulSoup物件
soup=BeautifulSoup("<html>data</html>")
print(soup)
出現警告:GuessedAtParserWarning: No parser was explicitly specified
解決警告問題,創建BeautifulSoup物件時,指定決議器
soup=BeautifulSoup("<html>data</html>
<4>、BeautifulSoup物件的find方法
1、根據標簽名查找
#1、匯入模塊
from bs4 import BeautifulSoup
#2、準備文本字串
html_doc="""<html><head>........ <p class="img_title">陳雨菲羽毛球女單奪冠</p>
"""
#3、創建BeautifulSoup物件
soup=BeautifulSoup(html_doc,'lxml')
#4、查找檔案中的title標簽
title=soup.find('title')
#5、查找檔案中a(需要的)標簽
a=soup.find('a')
print(a)#只輸出第一個a標簽
a_s=soup.find_all('a')
print(a_s)#輸出所有的a標簽
2、根據屬性查找
#方法一、通過命名引數進行指定的
a=soup.find(id='link1')
#方法二、使用attrs來指定屬性字典,進行查找
a=soup.find(attrs={'id':'link1'}) (方法二適用性更強)
3、根據文本查找
text=soup.find(text='陳雨菲')
<5>、BeautifulSoup物件的find方法—Tag物件
Tag物件對應于原始檔案中的XML或HTML標簽, Tag 物件Tag有很多方法和屬性,可用遍歷檔案樹和搜索檔案樹以及獲取標簽內容
Tag物件常用屬性
name:獲取標簽名稱
attrs:獲取標簽所有屬性的鍵和值
text:獲取標簽的文本字串
#獲取a標簽的Tag物件
a=soup.find('a')
print(a)
#Tag的name屬性,獲取標簽名
print('標簽名',a.name)
#Tag的attrs屬性,標簽所有屬性的鍵和值
print('所有屬性',a.attrs)
#Tag的text屬性,獲取標簽的文本字串
print('標簽文本',a.text)
三、正則運算式
1、概念:正則運算式是一種字串匹配的模式(pattern)
2、作用:從某個字串中提取符合某種條件的子串
3、語法
1..匹配除換行符(\n)以外的所有字符
2.\d匹配[0-9]的數字
3.\w匹配字母數字_和中文;
4*前面的一個匹配模式出現0次或多次
5+前面的一個匹配模式出現1次或多次
6?前面的一個匹配模型出現0或1次
import re
rs=re.findall("a\nc", "a\nc")
print(rs)#['a\nc']
rs=re.findall("a\\\\nc", "a\\nc")
print(rs)#['a\\nc']
rs=re.findall(r"a\nc", "a\nc")
print(rs)#['a\nc']
正則中使用r原始字串,能夠忽略轉義符號帶來的影響
帶匹配的字串中有多少個\,r原串正則中就添加多少個\即可
4、提取json字串http://ncov.dxy.cn/ncovh5/view/pneumonia
import requests
from bs4 import BeautifulSoup
import re
#1發送請求,獲取回應
response=requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia')
#2從回應中獲取資料
page=response.content.decode()
#3構建BeautifulSoup物件
soup=BeautifulSoup(page,'lxml')
#print(soup)
#4根據id查找,包含全國疫情資訊的標簽
#st=soup.find(id='getAreaStat')
st=soup.find(id='getListByCountryTypeService2true')
#print(st)
#5獲取標簽中文本內容
te=st.string#st.text不行
print(te)
#6提取json字串
json_str=re.findall(r'(\[.*\])', te)
print(json_str)
5、總結
(1)正則運算式是一種字串匹配的模式(pattern),在爬蟲中主要用于從某個字串中
提取符合某種條件的子串
(2)常見語法:.[] \d\w*+?
(3)refindall()查找字串所有與正則匹配的子串回傳一個串列,如果沒有找到回傳空列
表
(4)refindall()如果正則中沒有分組,回傳與整個正則匹配的子串,如果正則中有分組,只返
回與分組匹配的子串,分組兩邊的正則是用于定位的.
(5)正則中使用r原串就是為了消除轉移符(\)的影響,也就是匹配的字串中,有多少個轉
移符,r原串的正則中寫幾個\就可以了.
6、JSON轉Python(json.loads())
###JSON轉Python
import json
#1、json字串,轉換Python型別資料
#1.1準備json字串
str='{"provinceName":"臺灣","provinceShortName":"臺灣","currentConfirmedCount":"2029"}'
#1.2把json字串轉換為python型別的資料
python1=json.loads(str)
#1.3輸出結果
print(python1)
#2、json格式檔案 轉換python型別資料
#2.1打開檔案物件
with open('data11.json',encoding='utf-8') as f:
#2.2把檔案中的json格式內容轉換python型別資料
python2=json.load(f)
#2.3輸出
print(python2)
print(type(python2))
7、Python轉Json(json.dumps())
##python轉換為json
#1python型別資料轉換為json字串json.dumps(obj)
import json
str='{"provinceName":"臺灣","provinceShortName":"臺灣","currentConfirmedCount":"2029"}'
json1=json.dumps(str)
print(json1)#"{\"provinceName\":\"\u53f0\u6e7e\",\"provinceShortName\":\"\u53f0\u6e7e\",\"currentConfirmedCount\":\"2029\"}"
json2=json.dumps(str,ensure_ascii=False)
print(json2)#"{\"provinceName\":\"臺灣\",\"provinceShortName\":\"臺灣\",\"currentConfirmedCount\":\"2029\"}"
#2Python型別資料以json格式寫入檔案json.dump(obj,fp)
with open('data11.json',mode='w') as f:
python1=json.loads(str)
#以json格式寫入檔案,寫入的內容不包含非ASCII字符
a=json.dump(python1,f)
print(a)
#以json格式寫入檔案,寫入的內容包含非ASCII字符
b=json.dump(python1,f,ensure_ascii=False)
print(b)
四、案例——統計今日(2021/8/3)以來的所有疫情資訊
###########案例、統計2021/8/4以來各國的疫情資訊###########
import requests
from bs4 import BeautifulSoup
import re
import json
from tqdm import tqdm#進度條
class CoronaVirusSpider(object):
#類CoronaVirusSpider
def __init__(self):
self.home_url='http://ncov.dxy.cn/ncovh5/view/pneumonia'
def get_content_from_url(self,url):
#發送請求,獲取回應
response=requests.get(url)
#從回應中獲取資料
return response.content.decode()
def parse_home_page(self,home_page):
#決議首頁內容,獲取決議后的python資料
#構建BeautifulSoup物件
soup=BeautifulSoup(home_page,'lxml')
#根據id查找,包含全國疫情資訊的標簽
script=soup.find(id='getListByCountryTypeService2true')
#獲取標簽中文本內容
text=script.string
#提取json字串
json_str=re.findall(r'(\[.+\])',text)[0]
#把json轉換為python
data=json.loads(json_str)
return data
def save(self,data,path):
#保存資料
with open(path,'w',encoding='utf-8') as fp:
json.dump(data,fp,ensure_ascii=False)
def crawl_last_day_corona_virus(self):
#爬取采集最近一天的各國疫情資訊
#1、發送請求,獲取首頁內容
home_page=self.get_content_from_url(self.home_url)
#2、決議首頁內容,獲取最近一天的各國疫情資料
last_day_corona_virus=self.parse_home_page(home_page)
#3、保存資料
self.save(last_day_corona_virus,'last_day_corona_virus.json')
def crawl_corona_virus(self):
#采集各國疫情資料
#1、加載疫情資料
with open('last_day_corona_virus.json',encoding='utf-8') as fp:
last_day_corona_virus=json.load(fp)
#print(last_day_corona_virus)#得到串列資料
corona_virus=[]#定義串列,用于存盤各國從1、23以來的疫情資料
#2、遍歷各國疫情資料,獲取統計的URL
for country in tqdm(last_day_corona_virus,'采集1.23以來的各國疫情資訊'):
#for country in last_day_corona_virus:
#3、發送請求,獲取json資料
statistics_data_url=country['statisticsData']
statistics_data_json_str=self.get_content_from_url(statistics_data_url)
#4、把json資料轉換為python型別的資料,添加到串列中
statistics_data=json.loads(statistics_data_json_str)['data']
#print(statistics_data)
for one_day in statistics_data:
one_day['provinceName']=country['provinceName']
#print(statistics_data)
corona_virus.extend(statistics_data)#放到串列
#5、把串列以json格式保存為檔案
self.save(corona_virus,'corcona_virus.json')
def run(self):
#self.crawl_last_day_corona_virus()#開始運行這個生成last_day_corona_virus.json
self.crawl_corona_virus()
if __name__=='__main__':
spider=CoronaVirusSpider()
spider.run()

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292041.html
標籤:python
