爬蟲

一.markdown格式

經常使用語法

最多見的Markdown格式選項和鍵盤快捷鍵 [3] :html

輸出後的效果 Markdown 快捷鍵
Bold text Ctrl/⌘ + B
Emphasize text Ctrl/⌘ + I
Link title Ctrl/⌘ + K
Inline Code code Ctrl/⌘ + Shift + K
Image   Ctrl/⌘ + Shift + I
List * item Ctrl + L
Blockquote > quote Ctrl + Q
H1 # Heading  
H2 ## Heading Ctrl/⌘ + H
H3 ### Heading Ctrl/⌘ + H (x2)

 

標題

標題能顯示出文章的結構。行首插入1-6個 # ,每增長一個 # 表示更深刻層次的內容,對應到標題的深度由 1-6 階。web

  • H1 :# Header 1json

  • H2 :## Header 2瀏覽器

  • H3 :### Header 3markdown

  • H4 :#### Header 4網絡

  • H5 :##### Header 5app

  • H6 :###### Header 6編輯器

 

文本樣式

(帶「*」星號的文本樣式,在原版Markdown標準中不存在,但在其大部分衍生標準中被添加)工具

  • 連接 :Titlepost

  • 加粗 :*Bold*

  • 斜體字 :*Italics*

  • *高亮 :==text==

  • 段落 : 段落之間空一行

  • 換行符 : 一行結束時輸入兩個空格

  • 列表 :* 添加星號成爲一個新的列表項。

  • 引用 :> 引用內容

  • 內嵌代碼 : alert('Hello World');

  • 畫水平線 (HR) :--------

  • 方框:- [ ] -

 

圖片

使用Markdown將圖像插入文章,你須要在Markdown編輯器輸入 。 這時在預覽面板中會自動建立一個圖像上傳框。你能夠從電腦桌面拖放圖片(.png, .gif, .jpg)到上傳框, 或者點擊圖片上傳框使用標準的圖像上傳方式。 若是你想經過連接插入網絡上已經存在的圖片,只要單擊圖片上傳框的左下角的「連接」圖標,這時就會呈現圖像URL的輸入框。想給圖片添加一個標題, 你須要作的是將標題文本插圖中的方括號,e.g;.

 

腳註

腳註不存在於標準Markdown中。

使用這樣的佔位符號能夠將腳註添加到文本中:1. 另外,你可使用「n」而不是數字的n因此你能夠沒必要擔憂使用哪一個號碼。在您的文章的結尾,你能夠以下圖所示定義匹配的註腳,URL將變成連接:

`這裏是腳註[^1]``[^1]: 這裏是腳註的內容` `這裏是腳註[^n]``[^n]: 這裏是腳註的內容`

寫代碼

添加內嵌代碼可使用一對回勾號 alert('Hello World').對於插入代碼, Ghost支持標準的Markdown代碼和GitHub Flavored Markdown (GFM) [4] 。標準Markdown基於縮進代碼行或者4個空格位:

`   ``<``header``>    ``   ``<``h1``>{{title}}</``h1``>``   ``</``header``>`

GFM 使用三個回勾號```

`´´´``<``header``>``    ``<``h1``>{{title}}</``h1``>``</``header``>`

層級

用'-'和縮進控制

 

二.jupyter應用:基於瀏覽器的可視化工具

注:須要anaconda 集成環境

1.快捷鍵

Shift+Enter : 運行本單元,選中下個單元
Ctrl+Enter : 運行本單元
Alt+Enter : 運行本單元,在其下插入新單元
shift+tab : 打開幫助文檔
Y:單元轉入代碼狀態
M:單元轉入markdown狀態
A :在上方插入新單元
B:在下方插入新單元
X:剪切選中的單元
Shift +V:在上方粘貼單元

2.可視化工具的運行

選擇 jupyter

默認瀏覽器會直接啓動(或輸入jupyter notebook 啓動)

獲得可視化工具頁面

3.代碼只要在同一個原文件中就能夠,沒有上下之分

注:等號前要有空格

 

三.爬蟲

1.定義

經過編寫程序,模擬瀏覽器上網,讓其去互聯網上爬取數據的過程

2.分類

- 通用爬蟲 :經常使用於搜索引擎中
- 聚焦爬蟲 :爬取局部數據
- 增量式 :只爬取最新的內容

3.反爬機制

##反爬機制一

robots.txt協議:第一個反爬機制,一個網站約束了什麼數據可爬,什麼數據不可爬

4.folder:軟件形式的抓包工具

打開(雙擊)

配置

選擇tools中的options

https配置

重啓fiddler

功能

請求頭信息

當前請求所攜帶的參數

響應頭信息

響應的json數據

向右箭頭表明post請求,向左表明get請求

 

5.http和https協議

經常使用的請求頭信息

User-Agent:請求載體的身份標識
Connection:close/keep alive #鏈接的狀態

經常使用的相應頭信息

Content-Type:告訴瀏覽器返回的數據類型

四.requests模塊的使用

1.request模塊代碼編寫流程

1.指定url
2.發起請求
3.獲取相應對象中的數據
4.持久化存儲

2.抓取搜狗指定詞條相關頁面

import requests
url='https://www.sogou.com/web'
content=input("請輸入搜索內容:")
params={
    "query":content
}
#指定url,發起請求
response=requests.get(url=url,params=params).text#獲取相應對象中的數據
with 
#持久化存儲open('./sogou.html','w',encoding='utf-8') as f:
    f.write(response)
print("爬取完成!!!")
注:不一樣參數的數據格式

.txt #以字符串形式存儲
.content #存儲二進制數據
.json() #獲取json字符串

3.抓取百度翻譯相關頁面

import requests
url='https://fanyi.baidu.com/sug'
content=input("請輸入翻譯內容:")
params={
    "kw": content
}
response=requests.get(url=url,params=params).json()
print(response)
print("爬取完成!!!")
​
#結果
請輸入翻譯內容:美少女
{'errno': 0, 'data': [{'k': '美少女', 'v': 'beautiful young girl;nymph;'}, {'k': '美少女戰士', 'v': 'Sailor Moon;'}]}
爬取完成!!!

4.抓取豆瓣電影數據

import requests
url='https://movie.douban.com/j/chart/top_list'
params={
    "type": "5",
    "interval_id": "100:90",
    "action":"",
    "start": "1",
    "limit": "100"
}
response=requests.get(url=url,params=params).json()
print(response)
print("爬取完成!!!")

5.獲取肯德基指定地點餐廳數量信息

import requests
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
content=input("請輸入要查詢的地址:")
params={
    "cname": "",
    "pid": "",
    "keyword": content,
    "pageIndex": "1",
    "pageSize": "10",
}
response=requests.get(url=url,params=params).json()
print(response)
#結果
#請輸入要查詢的地址:北京
{'Table': [{'rowcount': 69}], 'Table1': [{'rownum': 1, 'storeName': '育慧裏', 'addressDetail': '小營東路3號北京凱基倫購物中心一層西側', 'pro': 'Wi-Fi,店內參觀,禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 2, 'storeName': '京通新城', 'addressDetail': '朝陽路楊閘環島西北京通苑30號樓一層南側', 'pro': 'Wi-Fi,店內參觀,禮品卡,生日餐會', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 3, 'storeName': '黃寺大街', 'addressDetail': '黃寺大街15號北京城鄉黃寺商廈', 'pro': 'Wi-Fi,店內參觀,禮品卡,生日餐會', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 4, 'storeName': '四季青橋', 'addressDetail': '西四環北路117號北京歐尚超市F一、B1', 'pro': 'Wi-Fi,店內參觀,禮品卡,生日餐會', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 5, 'storeName': '亦莊', 'addressDetail': '北京經濟開發區西環北路18號F1+F2', 'pro': 'Wi-Fi,店內參觀,禮品卡,生日餐會', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 6, 'storeName': '石園南大街', 'addressDetail': '通順路石園西區南側北京順義西單商場石園分店一層、二層部分', 'pro': 'Wi-Fi,店內參觀,禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 7, 'storeName': '北京站廣場', 'addressDetail': '北京站一層', 'pro': '禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 8, 'storeName': '北京南站', 'addressDetail': '北京南站候車大廳B島201號', 'pro': '禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 9, 'storeName': '北清路', 'addressDetail': '北京北清路1號146區', 'pro': 'Wi-Fi,店內參觀,禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}, {'rownum': 10, 'storeName': '大紅門新世紀肯德基餐廳', 'addressDetail': '海戶屯北京新世紀服裝商貿城一層南側', 'pro': 'Wi-Fi,店內參觀,禮品卡', 'provinceName': '北京市', 'cityName': '北京市'}]}
 

6.抓取生產許可證相關數據

##反爬機制二:User-Agent

import requests
id_list=[]
url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
headers={
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
page=input("查詢幾頁:")
for i in range(1,int(page)+1):
    params={
    "on": "true",
    "page": i,
    "pageSize": "15",
    "productName": "",
    "conditionType": "1",
    "applyname": "",
    "applysn": "",
    }
    object_list=requests.post(url=url,params=params,headers=headers).json()["list"]
    for object in  object_list:
        id_list.append(object["ID"])
      
for id in id_list:
    url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    params={
        "id": id
    }
    response=requests.post(url=url,params=params,headers=headers).json()
    print(response)

注:第二個反爬機制,UA反爬

反爬方式:模擬瀏覽器的useragent

 

7.爬取圖片內容

方式一:經過requests模塊

import requests
url='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1695604879,3405317932&fm=26&gp=0.jpg'
response=requests.get(url=url).content        
with open('./meishaonv.jpg','wb') as f:
    f.write(response)
print('爬取完成!!!')  

方式二:經過urllib模塊

import urllib
url='https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1695604879,3405317932&fm=26&gp=0.jpg'
urllib.request.urlretrieve(url=url,filename='meishaonv2.jpg')

五.數據解析

1.經過正則解析

(1)正則模塊補充

re.M 多行匹配

import re
content='''
sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^s.*",content,re.M)
#['sadasf', 'sdgdfg', 'sdgfd']

re.S 總體做爲一行匹配

import re
content='''
sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^.*",content,re.S)
#['\nsadasf\nsdgdfg\nsdgfd\ntghj\n']

re.I 忽略大小寫

import re
content='''sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^S",content,re.I)

(2)爬取糗事百科中全部圖片

import re
content='''sadasf
sdgdfg
sdgfd
tghj
'''
re.findall("^S",content,re.I)

2.經過bs4解析

(1)環境準備

pip3 install lxml #解析器
pip3 install bs4

(2)bs4的解析原理

1.將要進行解析的原碼加載到bs對象
2.調用bs對象中相關的方法或屬性進行原碼中相關標籤的定位
3.將定位到的標籤之間存在的文本或屬性值提取

(3)bs4的方法與屬性

(1)根據標籤名查找
soup.a 只能找到全部符合要求的標籤第一個
(2)獲取屬性(值)
soup.a.attrs 獲取a的全部屬性和屬性值,返回一個字典
soup.a.attrs['href'] 獲取a的href屬性值
soup.a["href"] 獲取a的href屬性值的簡寫
(3)獲取內容
soup.a.string 獲取a標籤中直系文本數據
soup.a.text 獲取a標籤的非直系文本數據
soup.a.get_text() 同上
(4)找到第一個符合要求的標籤
soup.find('a') 找到第一個a標籤
soup.find('a',title='xxx')
soup.find('a',alt='xxx')
soup.find('a',class_='xxx')
soup.find('a',id='xxx')
(5)找到全部符合要求的標籤
soup.find_all('a') 找到全部a標籤
soup.find_all('a',title='xxx')
soup.find_all('a',alt='xxx')
soup.find_all('a',class_='xxx')
soup.find_all('a',id='xxx')
(6)根據選擇器選擇指定的內容(返回值永遠是列表)
select:soup.select("#xxx")
常見選擇器:
    標籤選擇器:(a)
    類選擇器:(.)
    id選擇器:(#)
    層級選擇器:
        div .dudu #gh .name
        div>p>.acd>#hjk

(4)爬取詩詞名句網的三國演義

import requests
from bs4 import BeautifulSoup
url='http://www.shicimingju.com/book/sanguoyanyi.html'
headers={
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
​
response_str=requests.get(url=url,headers=headers).text
soup=BeautifulSoup(response_str,'lxml')
title_list=soup.select('.book-mulu > ul > li > a')
with open('sanguoyanyi.txt','w',encoding='utf-8') as f:
    for title in title_list:
        title_str=title.string
        f.write(title_str)
        content_url='http://www.shicimingju.com'+title['href']
​
        content=requests.get(url=content_url,headers=headers).text
        soup=BeautifulSoup(content,'lxml')
        content_list=soup.select('.chapter_content > p')
        for cont in content_list:
            cont_str=cont.string
            f.write(cont_str)
f.close()            
print("爬取完成!!")  
相關文章
相關標籤/搜索