selenium+PhantomJS爬取豆瓣讀書
本文實例為大家分享了selenium+PhantomJS爬取豆瓣讀書的具體代碼,供大家參考,具體內(nèi)容如下
獲取關(guān)于Python的全部書籍信息;
通過代碼測試 request攜帶‘User-Agent'及 ‘data'數(shù)據(jù)信息的方式均無法獲取到相關(guān)信息,獲取數(shù)據(jù)時,部分?jǐn)?shù)據(jù)為空,導(dǎo)致獲取過程中報錯,無法獲取全部數(shù)據(jù),初步判定豆瓣讀書的反爬機(jī)制較為嚴(yán)格;通過selenium 模擬瀏覽器請求的方法測試后發(fā)現(xiàn),可利用 selenium 方法請求獲取數(shù)據(jù);
#導(dǎo)入需要的模塊
from selenium import webdriver
import time
from lxml import etree
import pymysql
import re
#創(chuàng)建一個函數(shù)
def my_browers(url, page):
# 獲取瀏覽器對象
browers = webdriver.PhantomJS(executable_path=r'd:\Desktop\pythonjs\phantomjs-2.1.1-windows\bin\phantomjs.exe')
# 用瀏覽器發(fā)起請求
browers.get(url)
#休息兩秒,頻率低一點,爬的時間久一點,安全就多一點
time.sleep(2)
# 獲取頁面信息
html = browers.page_source
# 調(diào)用頁面解析函數(shù)
parse_html(html)
# 解析頁面信息
def parse_html(html):
# 生成一個xpath對象
html = etree.HTML(html)
# 獲取所有的書籍信息列表
books = html.xpath('//div[contains(@class,"sc-bZQynM")]')
# 遍歷每一本書籍 然后拿到我們想要的數(shù)據(jù)
for book in books:
# 創(chuàng)建一個存書字典存數(shù)據(jù)用
book_dict = {}
# 獲取封面信息
pic = book.xpath('//img/@src')
if pic:
book_dict['pic'] = pic[0]
else:
book_dict['pic'] = ''
# print(pic)
# 獲取書名
book_name = book.xpath('//div[@class="title"]/a/text()')
# print(book_name)
if book_name:
book_name = book_name[0]
# 刪除書名中最后出現(xiàn)的引號,
#由于存數(shù)據(jù)庫的時候書名最后面的引號會導(dǎo)致數(shù)據(jù)庫報錯,刪除可以使代碼更健壯
if '"' in book_name:
pattern = re.compile(r'"')
book_name = pattern.sub('', book_name)
if "'" in book_name:
pattern = re.compile(r"'")
book_name = pattern.sub('', book_name)
# 刪除書名中最后出現(xiàn)的\,存數(shù)據(jù)的時候書名最后的\會把sql語句最后的引號轉(zhuǎn)義,
#刪除可以使代碼更健壯
if '\\' in book_name:
book_name = book_name[:-1]
book_dict['book_name'] = book_name
else:
book_dict['book_name'] = ''
# 獲取書籍詳情連接
book_url = book.xpath('//div[@class="title"]/a/@href')
if book_url:
book_dict['book_url'] = book_url[0]
else:
book_dict['book_url'] = ''
# 獲取評分信息
score_book = book.xpath('//span[@class="rating_nums"]/text()')
if score_book:
book_dict['score_book'] = score_book[0]
else:
book_dict['score_book'] = ''
# 獲取出版社信息
book_detail = book.xpath('//div[@class="meta abstract"]/text()')
if book_detail:
# 刪除書詳情中最后出現(xiàn)的引號;
book_detail = book_detail[0]
if "'" in book_detail:
pattern = re.compile(r"'")
book_detail = pattern.sub('', book_detail)
book_dict['book_detail'] = book_detail
else:
book_dict['book_detail'] = ''
print(book_dict)
# 調(diào)用數(shù)據(jù)庫函數(shù)
insert_mysql(book_dict)
# 插入數(shù)據(jù)庫
def insert_mysql(book_dict):
# 連接數(shù)據(jù)庫
conn = pymysql.connect('localhost', 'root', 'root', 'test', charset='utf8')
# 創(chuàng)建操作數(shù)據(jù)庫的對象
cursor = conn.cursor()
pic = book_dict['pic']
book_name = book_dict['book_name']
book_url = book_dict['book_url']
score = book_dict['score_book']
book_detail = book_dict['book_detail']
sql = f"insert into python_book (pic,book_name,book_url,score,book_detail) " \
f"VALUE ('{pic}','{book_name}','{book_url}','{score}','{book_detail}')"
# 執(zhí)行并提交
cursor.execute(sql)
conn.commit()
if __name__ == '__main__':
for i in range(0, 199):
print('=================下載第{}頁========================'.format(i + 1))
page = i * 15
base_url = 'https://book.douban.com/subject_search?search_text=python&cat=1001&start={}'.format(page)
my_browers(base_url, page)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django框架中render_to_response()函數(shù)的使用方法
這篇文章主要介紹了Django框架中render_to_response()函數(shù)的使用方法,注意范例中該方法的參數(shù)的使用,需要的朋友可以參考下2015-07-07

