1. 程式人生 > >今日頭條圖片ajax異步加載爬取,並保存至mongodb,以及代碼寫法的改進

今日頭條圖片ajax異步加載爬取,並保存至mongodb,以及代碼寫法的改進

exception wow 發現 http img fin 以及 urn form

import requests,time,re,json,pymongo
from urllib.parse import urlencode
from requests.exceptions import RequestException
from bs4 import BeautifulSoup as bs

#連接mongodb
client = pymongo.MongoClient(host=‘localhost‘,port=27017)
#指定數據庫名稱
db = client.toutiao

#應對反扒機制, 不加useragent 爬取不到內容
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}

def get_page_index(offset,keyword):
#傳遞參數 需要傳遞一個字典格式 #通過分析發現異步加載需要改變 offset這個參數
data = {
"offset": offset,
"format": "json",
"keyword": keyword,
"autoload": "true",
"count": 20,
"cur_tab": 1,
"from": "search_tab",
}

#urlencode 可以將字典類型轉換為請求參數
url = "https://www.toutiao.com/search_content/?" + urlencode(data)
#url = "https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1&from=search_tab"
try:
rsp = requests.get(url,headers=headers)
if rsp.status_code == 200: #如果等於200 訪問成功
#print(rsp.text)
return rsp.text
else:
#print(1)
return None
except RequestException: ###需要了解的內容
print("請求出現錯誤")
return None

#運行main()後 發現返回數據都是json數據 設置解析函數
def parse_page_index(html):
data =json.loads(html)
if data and "data" in data.keys(): #如果確實取回json數據
#用生成器的方法
for item in data.get("data"):
yield item.get("article_url")# and item.get("title")
#yield item.get("title")

#進入每個標題頁面 進行解析
def get_page_detail(url):
try:
rsp = requests.get(url,headers=headers)
if rsp.status_code == 200: #如果等於200 訪問成功
#print(rsp.text)
return rsp.text
else:
#print(1)
return None
except RequestException: ###需要了解的內容
print("請求出現錯誤",url)
return None

def parse_page_detail(html,url):
#提取出標題
title = re.compile(r"title: ‘(.*?)‘,",re.S).findall(str(html))
title = "".join(title)

#提取標題下每個圖片的地址
image_url_list = re.compile(r‘http://p(.*?)&quot‘,re.S).findall(str(html))
IMG_LIST = []
for i in image_url_list:
image_url = "http://p"+ i
IMG_LIST.append(image_url)

return {
"title":title,
"url":url,
"image_list":IMG_LIST
}

#建立一個存儲方法 來方便mongodb的存儲
def save_to_mongo(focus_info):
if db["toutiao"].insert(focus_info):
print("存儲成功")
return True
return False

def main():
html = get_page_index(0,"街拍") #因為設置成函數,傳遞兩個可變的變量,方便日後改變
#print(html)

#遍歷提取生成器產生的每個標題鏈接
for url in parse_page_index(html):
#print(url)
time.sleep(1)
#將得到的標題url傳入解析函數
html = get_page_detail(url)
#print(html)

#將標題內的頁面傳入解析 得到標題 和照片地址的一個合集
focus_info = parse_page_detail(html,url)
#print(focus_info)

save_to_mongo(focus_info)


main()

今日得空,發個代碼記錄一下,感覺自己在代碼格式上有些許進步,比以前的代碼更公正,可靠性也更強

今日頭條圖片ajax異步加載爬取,並保存至mongodb,以及代碼寫法的改進