一、爬蟲的定義、爬蟲的分類(通用爬蟲、聚焦爬蟲)、爬蟲應用場景、爬蟲工作原理(最后會發一個完整爬蟲代碼)
二、http、https的介紹、url的形式、請求方法、響應狀態碼
url的形式:
請求頭:
常見響應狀態碼(可利用響應狀態碼判斷響應狀態assert response.status_code == 200):
三、數據請求,獲取響應(requests模塊,詳細使用方法api文檔)
中文文檔api:http://docs.python-requests.org/zh_CN/latest/index.html
發送請求格式:requests.get(url,headers=headers,timeout=5) #get方式
requests.post("http://www.baidu.com/", data = data,headers=headers) #post大文本傳輸,不限制長度,post更安全,data參數為字典
session = requests.session() session.get(url,headers)
cookies與session應用:cookies保存在瀏覽器端、session保存在服務端,利用session類保持會話連接請求頁面,但缺點不能請求多、快容易被識別
四、數據提取與分類(json模塊、lxml的etree模塊)
通常響應數據分為結構化數據與非結構化數據,結構化數據為json格式等,非結構化數據為html頁面等
結構化數據多為json格式,利用瀏覽器抓包工具,找到對應響應的Json字符串,在轉化為python數據類型(字典)
非結構化數據多為html頁面直接抓取,利用xpath節點選擇,抓取對應數據(需掌握xpath元素定位、配合工具Chrome插件 XPath Helper)
五、數據的保存
利用mongodb數據庫來存爬取的數據(安裝與部署請見mongodb的安裝與配置)或直接write保存到本地
五、糗事百科html數據提取與保存代碼
import requests from lxml import etree from pymongo import MongoClient client = MongoClient("127.0.0.1",27017) collection = client["duanzi"]["qiubai"] def get_url_list(): # 1.url的規律,構造一堆url出來
url_list = [] url_temp = "https://www.qiushibaike.com/8hr/page/{}/"
for i in range(1, 14): url = url_temp.format(i) url_list.append(url) return url_list def parse_url(url): headers = { "User-Agnet": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"} r = requests.get(url, headers=headers, timeout=5) hmtl_str = r.content.decode() html = etree.HTML(hmtl_str) # 使用etree處理,得到elemnet對象,能夠使用xpath方法
return html def get_content_list(html): # 3.提取數據
div_list = html.xpath("//div[@id='content-left']/div") content_list = [] for div in div_list: item = {} item["author_img"] = div.xpath("./div[@class='author clearfix']//img/@src") if len(item["author_img"]) > 0: # 獲取用戶的圖像圖片
item["author_img"] = "https:" + item["author_img"][0] else: item["author_img"] = None item["author_name"] = div.xpath("./div[@class='author clearfix']//h2/text()") if len(item["author_name"]) > 0: # 獲取用戶名字
item["author_name"] = item["author_name"][0].strip() else: item["author_name"] = None # 獲取性別
item["author_gender"] = div.xpath("./div[@class='author clearfix']/div/@class") if len(item["author_gender"]) > 0: item["author_gender"] = item["author_gender"][0].split(" ")[-1].replace("Icon", "") else: item["author_gender"] = None # 獲取年齡
item["author_age"] = div.xpath("./div[@class='author clearfix']/div/text()") if len(item["author_age"]) > 0: item["author_age"] = item["author_age"][0] else: item["author_age"] = None #獲取段子的正文
item["content"] = div.xpath(".//div[@class='content']/span/text()") item["content"] = [i.strip() for i in item["content"]] #提取點贊的的數量
item["stats_vote"] = div.xpath(".//span[@class='stats-vote']/i/text()") if len(item["stats_vote"])>0: item["stats_vote"] = item["stats_vote"][0] else: item["stats_vote"] = None #提取評論數量
item["stats_comments"] = div.xpath(".//span[@class='stats-comments']//i/text()") if len(item["stats_comments"])>0: item["stats_comments"] = item["stats_comments"][0] else: item["stats_comments"] = None #提取正文中的文中的圖片
item["content_img"] = div.xpath("./div[@class='thumb']//img/@src") if len(item["content_img"])>0: item["content_img"] = "https:"+item["content_img"][0] else: item["content_img"] = None content_list.append(item) return content_list def save_content_list(content_list): #保存
for content in content_list: print(content) collection.insert(content) print("*"*100) def run(): # 1.url的規律,構造一堆url出來
url_list = get_url_list() # 2.遍歷url_list,發送請求,獲取響應
for url in url_list: html = parse_url(url) # 3.提取數據
content_list = get_content_list(html) # 4.保存
save_content_list(content_list) if __name__ == '__main__': run()