用正則表達式實現一個簡單的小爬蟲
經常使用方法介紹
一、導入工具包
import requests
#導入請求模塊
from flask import json
#導入json模塊
from requests.exceptions import RequestException
#異常捕捉模塊
import re
#導入正則模塊
from multiprocessing import Pool
#導入進程模塊
二、獲取頁面
response =requests.get(url)
url:當前須要爬取的連接
requests.get()得到頁面
三、if response.status_code ==200:
#驗證狀態碼
response.status_code:獲取狀態碼
200:表示正常,鏈接成功
四、response.text:獲得頁面內容
例如:response =requests.get(url)
五、except RequestException:捕捉異常
try:
...
except RequestException:
...
六、pat = re.compile():編譯正則表達式
#正則表達式基礎知識便可
七、items =re.findall(pat,html)
pat:編譯過的正則表達式
html:用response.text獲得的頁面內容
re.findall():找到全部匹配的內容
八、打開文件
with open('result','a',encoding='utf-8')as f
with as :打開自動閉合的文件並設立對象f進行操做
result:文件名字
a:打開方式是續寫模式
encoding:編碼格式
九、寫入文件
f.write(json.dumps(conrent,ensure_ascii =False)+'\n')
json.dumps:以json方式寫入
十、簡單進程
pool = Pool()
#建立進程池
pool.map(func,[i*10 for i in range(10)])
[i*10 for i in range(10)]:生成器,生成0到9的數字乘以10的結果,生成一個列表爲[0,10,20....]
func:函數
map:將函數做用於列表每個元素
十一、yield:生成器
案例:用上面的工具完成爬去貓眼電影TOP榜
#__author:PL.Li
#導入須要使用的模塊
import requests
from flask import json
from requests.exceptions import RequestException
import re
from multiprocessing import Pool
#嘗試鏈接獲取頁面
def get_response(url):
try:
response =requests.get(url)
if response.status_code ==200:
return response.text
return None
except RequestException:
return None
#正則匹配須要的內容
def re_one_page(html):
#超級長的正則表達式進行匹配,匹配到的是個集合。
pat =re.compile('<dd>.*?board-index.*?">(/d+?)</i>.*?data-src="(.*?).*?name"><a.*?">(.*?)"class=.*?class="star">'
'(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
#用迭代進行異步操做
items =re.findall(pat,html)
for item in items:
yield {
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:],
'time':item[4].strip(),
'score':item[5]+item[6]
}
#保存寫入文件
def write_file(conrent):
with open('result','a',encoding='utf-8')as f:
f.write(json.dumps(conrent,ensure_ascii =False)+'\n')
f.close()
#配置啓動函數
def main(offset):
url ='http://maoyan.com/board'+str(offset)
html=get_response(url)
for item in re_one_page(html):
write_file(item)
#使用多進程加速一秒完成
if __name__ == '__main__':
pool = Pool()
pool.map(main,[i*10 for i in range(10)])