Python3 爬虫爬取中国图书网(淘书团) 记录
本人為一名剛開始學Python爬蟲的小白,開貼僅為記錄下自己的學習歷程,方便做review
?
要爬取鏈接:http://tuan.bookschina.com/
要爬取內容: 圖書名稱, 圖書價格, 以及對應預覽圖的link
本文用到py packages: requests, BeautifulSoup, json, cvs
打開中國圖書網團購頁面時,發現網站的信息是動態加載的:
Anyways,先不考慮加載更多頁的圖書信息,我們從嘗試著抓取第一頁的圖書信息開始:
本次爬蟲所用的瀏覽器為chrome
所以我們打開瀏覽器的開發者模式F12,可以看到頁面加載的相應信息
為了實現模擬瀏覽器登錄功能,我們需要查看header的信息:
完成對應的代碼:
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','Host': 'tuan.bookschina.com','Referer': 'http://tuan.bookschina.com/','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9' }?
接下來我們需要做的就是分析整個中國圖書網的DOM,去查看我們需要的信息,都封裝在哪些tags里面
經過地毯式搜索。。。。我們發現我們所需要的信息,都封裝在 <ul id='taoList".....>的子節點li里面
?
?
?所以,我們打算采取BeautifulSoup的解析抓取功能,來實現拿到li內的我們需要的信息
對應的代碼:
url = 'http://tuan.bookschina.com/' response = requests.get(url, headers = header) #模仿瀏覽器登錄 response.encoding = 'utf-8' soup = BeautifulSoup(response.text,'html.parser') for item in soup.select('div .taoListInner ul li'):print(item.select('h2')[0].text) #返回對象為數組print(item.select('.salePrice')[0].text)print(item.select('img')[0].get('src')) #get方法用來取得tab內部的屬性值?
首先我們需要調用requests的get方法,拿到響應的response,然后通過BS進行解析,我們會發現,在class 名為 taoListInner的div標簽中,封裝了我們想要的ul下的li
查看了beautifulsoup的文檔,對比了find_all 和select,決定調用select方法拿到對應的標簽,然后拿到對應h2標簽下的書名; salePrice class下的價格; 以及img標簽
內src的預覽圖link。這樣就可以打印出我們想要的第一頁所顯示的書籍的信息了。
?
但是問題就出來了。。。如果我們想拿后續頁面的更多書籍信息,該怎么辦呢,因為bs的select方法是只能解析靜態的Dom的
所以我們懷疑,后續的圖書數據是通過Ajax 或者 JS 加載的
我們來到開發者模式的XHR下面,我們會發現,每當我們下拉滾動條,刷新圖書信息的時候,會跟隨者刷新出一個GroupList?.....的鏈接
我們打開他
?
驚喜的發現在Preview里,封裝了我們需要的數據,并且是以Json形式予以保存的,這樣變能讓我們方便的拿到動態生成的圖書數據了。
?
?
所以我們要拿到這個Json數據,首先需要去拿他的Request URL
當前的URL為:http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=2&Tyjson=true
我們會發現一個規律,每當有新的書籍信息刷新一次的時候,生成的GroupList?...URL中的Page=?也會跟隨遞增
所以問題迎刃而解了。。。。我們只需要去通過遍歷URL并拿到返回的JSON進行解析,便可以拿到我們想要的全部數據了
也驗證了一個說法,許多動態加載的網站,都會把Json數據封裝作為response,這樣就給我們的爬蟲找到一條捷徑
?
url = 'http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=2&Tyjson=true' response = requests.get(url) result = json.loads(response.text) bookinfo = {} for data in result['Data']:bookinfo['bookName'] = data['book_name']bookinfo['price'] = data['group_price']bookinfo['iconLink'] = data['group_image'] print(url)?
這里用里調用了loads()方法,把返回的json數據轉換為python的字典,方便拿數據
拿到數據后我們決定把數據存入磁盤,生成cvs的excel文件,相關的寫入文件方法,請查閱python3官方文檔。
方便做進一步的數據分析。
?
所以,本次爬蟲小實驗全部代碼如下:
import requests from bs4 import BeautifulSoup import json import csvdef parse_one_page():header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','Host': 'tuan.bookschina.com','Referer': 'http://tuan.bookschina.com/','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9'}url = 'http://tuan.bookschina.com/'response = requests.get(url, headers = header) #模仿瀏覽器登錄response.encoding = 'utf-8'soup = BeautifulSoup(response.text,'html.parser')for item in soup.select('div .taoListInner ul li'):print(item.select('h2')[0].text) #返回對象為數組print(item.select('.salePrice')[0].text)print(item.select('img')[0].get('src')) #get方法用來取得tab內部的屬性值def dynamtic_scraping_data(page, headers, fileName):for i in range(page):url = 'http://tuan.bookschina.com/Home/GroupList?Type=0&Category=0&Price=0&Order=11&Page=' + str(i) + '&Tyjson=true'response = requests.get(url)result = json.loads(response.text)bookinfo = {}for data in result['Data']:bookinfo['bookName'] = data['book_name']bookinfo['price'] = data['group_price']bookinfo['iconLink'] = data['group_image']write_csv_rows(fileName,headers,bookinfo)print(url)def write_csv_headers(path, headers):with open(path, 'a', encoding='gb18030', newline='') as f:f_csv = csv.DictWriter(f, headers)f_csv.writeheader()def write_csv_rows(path, headers, rows):with open(path, 'a', encoding='gb18030', newline='') as f:f_csv = csv.DictWriter(f, headers)# 如果寫入數據為字典,則寫入一行,否則寫入多行if type(rows) == type({}):f_csv.writerow(rows)else:f_csv.writerows(rows) def main(page):# parse_one_page() #Tip: beautifulSoup testcsv_filename = "bookInfo.csv"headers = ['bookName', 'price', 'iconLink']write_csv_headers(csv_filename,headers)dynamtic_scraping_data(page, headers, csv_filename)if __name__ == '__main__':main(20) #input page num to start?
轉載于:https://www.cnblogs.com/ChrisInsistPy/p/8981820.html
總結
以上是生活随笔為你收集整理的Python3 爬虫爬取中国图书网(淘书团) 记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到河里涨大水预示着什么
- 下一篇: 梦到家人被杀什么预兆