simple_crawl
- 僅需一行代碼即可達到爬蟲效果
-
很多人學習python,不知道從何學起,
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手,
很多已經做案例的人,卻不知道如何去學習更加高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ群:961562169
使用方法
pip install simple_crawl
### 以下源代碼為簡單介紹,詳細功能介紹再源代碼之下
from simple_crawl import request
request.parse(
# status 引數為運行狀態,支持單執行緒多執行緒多行程協程以及聯合
status="aiohttp",
# url 引數為爬蟲網址,單執行緒狀態為字串格式,特殊狀態為串列格式
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
# login 引數為獲取登陸資訊,如淘寶等網址需要登陸資訊
#login="taobao",
# type_url 引數為回傳源代碼格式,支持text和json,默認回傳text
type_url = "text",
# Parsing 引數為決議方法,支持re、xpath和beautifulsoup
Parsing = 'xpath',
# label 引數為爬蟲決議程序,字典格式,詳情見下方
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
# write 引數為爬蟲結果保存,支持txt、csv、pkl、json,注:特殊狀態爬蟲資訊容易混亂
write='result.txt',
# next_url 引數為下一頁爬蟲地址,@必須為href,僅支持單執行緒爬蟲
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
# page 引數為斷續筆記,第一個引數是否啟用筆記,第二個引數選填默認page.txt,僅支持單執行緒爬蟲
page=[True,"now_url.txt"],
# clean 引數為是否進行資料清洗,防止大量爬蟲收集無用資訊
#clean=True,
# texting 引數為是否選擇連續爬蟲,避免爬蟲程序中出現非代碼問題報錯結束爬蟲程式
texting=True,
# Thread_num 為多執行緒數,默認為1單執行緒,支持多執行緒狀態和異步狀態
Thread_num=3,
# cpu_count 為多行程數,默認為1單行程,支持多行程狀態和聯合狀態
cpu_count=1,
# sem 為異步控制數,默認為5同時啟動,支持異步狀態和聯合狀態
sem=5,
# write_SQL 為是否寫入資料庫,默認否
# host 引數默認localhost
# post 引數默認3306
# user 引數默認root
# password 引數必填,必須正確
# db 引數為即將存入的資料庫名,若不存在自動創建
# table 引數為即將存入的資料表名,若不存在自動創建
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
介紹一下crawl引數設定:
'''
單行代碼爬蟲程式執行
:param status:啟用爬蟲型別,支持普通爬蟲、多行程爬蟲、多執行緒爬蟲、異步爬蟲、異步多行程爬蟲,引數請參考檔案
:param url:即將請求的url地址,僅支持get請求
:param type_url:請求url后回傳格式,支持text和json格式回傳
:param Thread_num:即將啟動多執行緒個數,默認為1單執行緒
:param sem:協程信號量,控制協程數,防止爬的過快,默認為5
:param cpu_count:運行爬蟲使用多行程cpu核數,默認為系統核數一半
:param login:模擬網站登陸,保存登陸資訊
:param Parsing:爬蟲方式,支持re、xpath以及bs4方法
:param texting:是否啟用連續爬蟲,爬蟲程式例外報錯后重新啟動爬蟲,
多次報錯結束程式,默認否
:param label:選擇器內容,字典格式保存,
字典值為串列格式,第一個引數為選擇器,第二個引數為轉換型別
第一個引數必填,第二個引數默認str型別
:param write:是否寫入檔案,支持txt格式、csv格式、json格式以及pkl格式,默認否
:param next_url:是否跨頁爬蟲,選擇器內容使爬蟲繼續翻頁爬蟲
:param page:是否選擇斷續筆記接手下次爬蟲處理,默認否
:param clean:是否進行簡單型別資料清洗,默認否
:param write_sql:是否寫入資料庫,默認否
'host'默認為'localhost','post'默認'3306','user'默認'root',
'password':'密碼','db':'資料庫','table':'資料表',
檢測庫是否存在,若不存在則創建,若存在則直接插入,
檢測表是否存在,若不存在則創建,若存在則直接插入
:return True
'''
介紹玩法
接下來介紹的均為呼叫第三方庫的情況下運行:
from simple_crawl import request
第一種玩法:輸出源代碼
呼叫requests庫進行源代碼請求,
特點:
請求失敗則呼叫ip池處理重新請求訪問,
出現五次失敗默認網址輸入錯誤,
支持text以及json字串回傳,默認text,
缺點:
暫時只能進行get請求,不支持post訪問
:return text or json
request.parse(
url = "https://www.douban.com/group/explore",
type_url = "text"
).run()
# return text
第二種玩法:模擬網站登陸并保存資訊
呼叫DecryptLogin庫請求登陸訪問,
ps:DecryptLogin庫為大佬皮卡丘寫的一個很不錯的模擬網站登陸庫,在此參考一下,因為單行爬蟲原因不支持賬號密碼登陸,我將大佬寫的二維碼登陸使用過來了,再次感謝大佬開源
在此放出檔案地址
DecryptLogin庫中文檔案:https://httpsgithubcomcharlespikachudecryptlogin.readthedocs.io/zh/latest/
特點:
將DecryptLogin庫中二維碼繼承到此庫(非二次開發)
支持QQ群、QQ空間、QQ安全中心、淘寶、京東和斗魚登陸(大佬登陸庫中所有的二維碼登陸)
保存session.pkl資訊到本地方便下次登陸運行
缺點:
session.pkl登陸資訊過時無法自動洗掉,
導致下次登陸疑似cookie無法正常登陸,
:return session
request.parse(
# 臭不要臉的推廣一下我的店鋪
url="https://shop574805287.taobao.com/",
login="taobao"
).run()
# return text
第三種玩法:爬取網站資訊
爬蟲庫自然少不了爬蟲的程序
特點:
支持re庫,xpath決議以及bs4選擇器,
爬取方法為字典格式,單方面輸出,
字典鍵為保存的欄位名稱,
字典值為串列格式:第一個引數為選擇器,第二個引數為轉換型別,第一個引數必填,第二個引數默認str型別,
缺點:暫無(等待小伙伴們發現)
:return reptile_results
request.parse(
url='https://www.douban.com/group/explore',
# 字串格式,選擇器方法,
Parsing = 'xpath',
# 字典格式,引數如上,
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
}
).run()
# return reptile_results(list)
第四種玩法:自由保存資訊
目前版本支持保存txt、csv、json以及pkl四大主流檔案,日后版本更新將發布更為全面的保存方法,
特點:
寫入檔案均為資料格式傳入檔案,
且輸入格式規范方便閱讀and省事,
缺點:
保存格式僅四種,
不方便用戶之后讀寫操作,
:return file
request.parse(
url='https://www.douban.com/group/explore',
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
# 字串格式,具體保存位置填寫
write='result.pkl'
).run()
# return file
第五種玩法:讀取下一頁 url 地址繼續爬蟲
這也是每個人都擔心的問題,僅僅一行代碼怎么可能翻頁爬蟲,這還真能做到哦~
特點:
繼承之前的Parsing引數選擇器選擇方法,
在這里可讀取到決議后的下一頁 url 網址,
方可繼續進行爬蟲處理,方便用戶使用,
缺點:
若爬蟲時下一頁 url 地址改變,便結束爬蟲,
只能爬取所給 url 地址中的資訊,
無法進行某一界面的多個網頁爬取回傳,
造成訪問頁面單一流失,
:return None
request.parse(
url='https://www.douban.com/group/explore',
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.pkl',
# 字串格式,根據Parsing方法繼續請求下一頁a中href
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
).run()
# return None
第六種玩法:爬蟲網頁保存
聽說過爬蟲斷續重連的朋友應該懂得這是個什么神仙操作,每次爬蟲運行期間好好的,睡一覺醒來發現代碼報錯了,,,這就是個很難受的事,還不知道之前爬取到哪一頁了,只能重新爬蟲了啊!
特點:
持續輸出斷續筆記,
將此次爬蟲的 url 地址保存到一個文本檔案內部,
下次讀取文本檔案即可快速進行直接斷掉的爬蟲 url 地址繼續爬取所需,
缺點:
讀取內容不單一,
導致下次爬蟲無法正確讀取上次爬蟲留下的痕跡,
:return url_file
request.parse(
url='https://www.douban.com/group/explore',
type_url='text',
#login='taobao',
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.pkl',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
# 第一個引數為是否需要斷續筆記,
# 第二個引數為斷續筆記保存位置,
page=[True,'url_page.txt']
).run()
# return url_file
第七種玩法:簡單資料清洗
資料拿下后,直接保存到本地有些大佬可能覺得很辣雞,連清洗都不清洗就存入本地了?那得拿到多少廢資料臟資料,那么接下來介紹一下清洗引數,
特點:
本人曾寫過一個底層資料清洗,
能將串列格式資料進行歸分清洗,
主要內容請參考另一篇文章
如下連接:資料清洗
缺點:
資料清洗格式簡單,
資料清洗內容單一,
無法完全做到絕對清洗,
有待改善,
:return keyword_list, value_list
request.parse(
url='https://www.douban.com/group/explore',
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.pkl',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,'url_page.txt'],
# bool型別,默認不清洗
clean=True
).run()
第八種玩法:爬蟲存入資料庫
存到txt、存到csv、存到json、存到pkl,那也太low了吧,現在流行的資料庫用不了么?那是不可能的,,
特點:
資訊存入MySQL資料庫,
可連接docker遠程資料庫,
資料庫的庫名可以不存在,
資料庫的表名可以不存在,
根據之前傳入字典鍵與值引數判斷表型別,
自由建立資料表傳入資訊,
缺點:
僅支持MySQL資料庫,
:return SQL
request.parse(
url='https://www.douban.com/group/explore',
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.pkl',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,'url_page.txt'],
clean=True,
# 字典格式,
# host可有可無,默認localhost
# post可有可無,默認3306
# user可有可無,默認root
# password必要引數,資料庫連接密碼
# db必要引數,資料庫即將存入的庫名
# table必要引數,資料庫即將存入的表名
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
第九種玩法:重新啟動爬蟲
爬蟲最讓人厭煩的就是被一個不痛不癢的錯誤資訊給終止爬蟲了,比如意外的遠程斷開鏈接等低級非代碼錯誤,報錯之后還得重新啟動斷續爬蟲,就顯得很麻煩,我做了一期爬蟲程式例外報錯后重新啟動爬蟲,多次報錯結束程式,
特點:
檢測報錯重新啟動爬蟲
無需手動處理錯誤資訊
缺點:
無法收集子執行緒錯誤,
:return None
request.parse(
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
#login="taobao",
type_url = "text",
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.txt',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,"now_url.txt"],
# texting 引數為是否啟用連續爬蟲
# 爬蟲程式例外報錯后重新啟動爬蟲
texting=True,
###
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
第十種玩法:多執行緒爬蟲
特點:
爬蟲速度加快,
更好的利用了執行緒,
缺點:暫無
:return None
request.parse(
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
#login="taobao",
type_url = "text",
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.txt',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,"now_url.txt"],
#clean=True,
texting=True,
# status="threads" 啟用多執行緒爬蟲
# Thread_num 為執行緒數目,默認為1 單執行緒
status="threads",
Thread_num=3,
###
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
第十一種玩法:多行程爬蟲
特點:
爬蟲速度加快,
更好的利用了行程,
缺點:暫無
:return None
from simple_crawl import request
request.parse(
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
#login="taobao",
type_url = "text",
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.txt',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,"now_url.txt"],
#clean=True,
texting=True,
# status="multiprocessing" 啟用多行程爬蟲
# cpu_count 為啟動代碼核心數,默認為系統核數一半
status="multiprocessing",
cpu_count=2,
###
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
第十二種玩法:異步多執行緒爬蟲
特點:
爬蟲速度加快,
異步使得爬蟲無等待時間,
同時使用多執行緒速度明顯加快,
缺點:暫無
:return None
from simple_crawl import request
request.parse(
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
#login="taobao",
type_url = "text",
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.txt',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,"now_url.txt"],
#clean=True,
texting=True,
# sem 引數為異步引擎數目,默認為5
# 其他引數同上
status="aiohttp",
Thread_num=3,
sem=5,
###
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
第十三種玩法:異步多行程爬蟲
特點:
爬蟲速度加快,
異步使得爬蟲無等待時間,
同時使用多行程速度明顯加快,
缺點:暫無
:return None
from simple_crawl import request
request.parse(
url=['https://www.douban.com/group/explore?start={}'.format(i) for i in range(0,180,30)],
#login="taobao",
type_url = "text",
Parsing = 'xpath',
label = {
'url':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/@href',str],
'name':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/h3/a/text()',str],
'Author':['//*[@id="content"]/div/div[1]/div[1]/div[1]/div[2]/div[2]/span[1]/a/text()',str]
},
write='result.txt',
next_url='//*[@id="content"]/div/div[1]/div[2]/span[4]/a/@href',
page=[True,"now_url.txt"],
#clean=True,
texting=True,
# 引數如上
status="between",
cpu_count=1,
sem=5,
###
write_SQL={
'host':'localhost',
'post':'3306',
'user':'root',
'password':'123456',
'db':'example',
'table':'example'
}
).run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157387.html
標籤:其他
