本次的這篇文章主要是和大家分享了一篇關於記錄一次簡單的Python爬蟲執行個體 ,有需要的小夥伴可以看一下。
主要流程分為:
爬取、整理、儲存
1.其中用到幾個包,包括
requests 用於向網站發送請求,並獲得網頁代碼
BeautifulSoup4 用於處理獲得的網頁代碼,提取有效資訊
pandas 用於儲存資訊
其中在to_excel(‘docname.xlsx’)時,可能去要另外的包 openpyxl
import requestsfrom bs4 import BeautifulSoupimport reimport jsonimport pandasimport excelimport sqlite3# import openpyxl
2.以爬取新浪網址中各個新聞的責任編輯為例子
可以按照反向推算的方式確定def的functions
擷取到了當條新聞下的網頁網址後,如何獲得責任編輯?
d
ef getComments(url): # 向url對應網址發送請求,擷取到的網頁內容儲存在res中 res=requests.get(url) # 將res內容編碼,編碼的方式'utf-8'根據網頁的charset而定 res.encoding='utf-8' # 因為需要處理res,因此將文本存入soup # html.parser不清楚是幹嘛的 soup=BeautifulSoup(res.text,'html.parser') # 根據所需要的內容,通過BS4的select選擇,得到數組,用[0]取出元素 # 因為是文本所以直接通過.text得到所需要的內容 return soup.select('.show_author')[0].text# 在soup.select('.link')[0]中,若為id則帶## 若為class則帶.# 其他的如a和h1等則無要求#其中需要層層select並取[0]#有些有多元素,則需通過for遍曆
ii) 根據首頁面如何獲得各條新聞網頁的網址
某行檔案是在json中發現,因此通過comments=requests.get(‘url’)再
jd=json.loads(comments.text.strip(‘var data=‘))
jd=[‘result’][‘count’][‘total’] ==>這裡為字典中的字典,可以從網頁檢查元素的preview中查看
==>可轉化為字典
其中要恢複成字典,左右兩頭多出了什麼就要通過strip()去除
有些需要分左右側分別刪除則通過lstrip()與rstrip(),即left和right
==>for ent in ~:
ent[‘url’]
***) soup.select()到的所需元素在同一個類中,則可以使用contents[0]區分
***)time與str間的轉換
from datetime import date timeStr==>time dt=datetime.strptime(timesource,’%Y%m%d’)time==>Str dt.strftime(‘%Y-%m-%d’)
***) 將list[]各元素串連
‘-‘.join(list) #將list中的各元素以-方式串連‘’.join([p.text.strip() for p in soup.select(‘#artibody p’)[:-1]])
***) 對於有多頁的網址,則需要找到page對應部分改為{},
然後通過format()進行替換
news_total=[]for i in range(1,3): newsurl=url.format(i) newsary=parseListlink(newsurl) new_total.extend(newsary)
3. 使用pandas儲存資料,其中是DataFrame()功能函數
df=pandas.DataFrame(list)print(df.head(20)) #顯示前20條資訊df.to_excel('news.xlsx') #轉存為excel格式,名字為news.xlsx
其中list的格式為
for u in geturl(url): excel1 = [] # 迴圈開始清空數組 result = {} # 迴圈開始清空字典 try: # 每個條目在新字典賦值 result['zeren']=getComments(u) result['id']=i i=i+1 except: continue #每個條目形成數組 excel1.append(result) #在列表中添加數組 list.extend(excel1)
4. 儲存資料庫
df=pandas.DataFrame(list)print(df.head(20)) #顯示前20條資訊# df.to_excel('news.xlsx') #轉存為excel格式,名字為news.xlsxwith sqlite3.connect('news.sqlite') as db: # 存入news.sqlite檔案中的news表格 df.to_sql('news',con=db) # 讀取/查詢news表格並將資料賦值給df2 df2=pandas.read_sql_query('SELECT * FROM news',con=db)