selenium+PhantomJS爬取豆瓣读书
本文实例为大家分享了selenium+PhantomJS爬取豆瓣读书的具体代码,供大家参考,具体内容如下
获取关于Python的全部书籍信息;
通过代码测试request携带‘User-Agent'及‘data'数据信息的方式均无法获取到相关信息,获取数据时,部分数据为空,导致获取过程中报错,无法获取全部数据,初步判定豆瓣读书的反爬机制较为严格;通过selenium模拟浏览器请求的方法测试后发现,可利用selenium方法请求获取数据;
#导入需要的模块
fromseleniumimportwebdriver
importtime
fromlxmlimportetree
importpymysql
importre
#创建一个函数
defmy_browers(url,page):
#获取浏览器对象
browers=webdriver.PhantomJS(executable_path=r'd:\Desktop\pythonjs\phantomjs-2.1.1-windows\bin\phantomjs.exe')
#用浏览器发起请求
browers.get(url)
#休息两秒,频率低一点,爬的时间久一点,安全就多一点
time.sleep(2)
#获取页面信息
html=browers.page_source
#调用页面解析函数
parse_html(html)
#解析页面信息
defparse_html(html):
#生成一个xpath对象
html=etree.HTML(html)
#获取所有的书籍信息列表
books=html.xpath('//div[contains(@class,"sc-bZQynM")]')
#遍历每一本书籍然后拿到我们想要的数据
forbookinbooks:
#创建一个存书字典存数据用
book_dict={}
#获取封面信息
pic=book.xpath('//img/@src')
ifpic:
book_dict['pic']=pic[0]
else:
book_dict['pic']=''
#print(pic)
#获取书名
book_name=book.xpath('//div[@class="title"]/a/text()')
#print(book_name)
ifbook_name:
book_name=book_name[0]
#删除书名中最后出现的引号,
#由于存数据库的时候书名最后面的引号会导致数据库报错,删除可以使代码更健壮
if'"'inbook_name:
pattern=re.compile(r'"')
book_name=pattern.sub('',book_name)
if"'"inbook_name:
pattern=re.compile(r"'")
book_name=pattern.sub('',book_name)
#删除书名中最后出现的\,存数据的时候书名最后的\会把sql语句最后的引号转义,
#删除可以使代码更健壮
if'\\'inbook_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')
ifbook_url:
book_dict['book_url']=book_url[0]
else:
book_dict['book_url']=''
#获取评分信息
score_book=book.xpath('//span[@class="rating_nums"]/text()')
ifscore_book:
book_dict['score_book']=score_book[0]
else:
book_dict['score_book']=''
#获取出版社信息
book_detail=book.xpath('//div[@class="metaabstract"]/text()')
ifbook_detail:
#删除书详情中最后出现的引号;
book_detail=book_detail[0]
if"'"inbook_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)
#调用数据库函数
insert_mysql(book_dict)
#插入数据库
definsert_mysql(book_dict):
#连接数据库
conn=pymysql.connect('localhost','root','root','test',charset='utf8')
#创建操作数据库的对象
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"insertintopython_book(pic,book_name,book_url,score,book_detail)"\
f"VALUE('{pic}','{book_name}','{book_url}','{score}','{book_detail}')"
#执行并提交
cursor.execute(sql)
conn.commit()
if__name__=='__main__':
foriinrange(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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。