课前说明:本章节请求的 url 部分用 ** 代替
本章节需要掌握的知识点:
1、用 js 代码模拟下拉动作:
document.documentElement.scrollTop= %d %d表示下拉的幅度
2、如何使用 redis 数据库进行数据存储
爬虫分三个模块:
1、请求模块:用于构造请求体,并将请求到的网页(数据)返回给解析模块;
2、解析模块:用于提取数据(本章节用xpath提取网页中的数据),并返回数据给存储模块;
3、存储模块:用 redis 数据库存储数据。
案例简介:
用于抓取网页 https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F 中的图片
简单解析一下爬虫的思路:
1、访问链接: https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F
检查该网站是否动态加载网站(本网站为动态网站)
爬取动态网页需要借助 selenium 工具;
2、用xpath 解析网页内容;
3、将爬取到的数据存储到 redis 数据库中;
4、下载图片;
5、撰写爬虫代码,具体代码如下:
from time import sleep
import redis
from selenium import webdriver
from urllib import request
from lxml import etree
driver = r"/home/**/Downloads/chromedriver"
# 把浏览器改为无界面浏览器
opt = webdriver.ChromeOptions()
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')
browser = webdriver.Chrome(executable_path=driver, options=opt)
# 请求模块
def request_html(url):
'''
:param url: 请求url
:return: 返回请求到的页面
'''
browser.get(url)
sleep(2)
dis = 0
for _ in range(50):
dis += 10
# 执行下拉操作的 js 代码
js = 'document.documentElement.scrollTop=%d' % dis
browser.execute_script(js)
# 每执行一次,等待0.02秒,模仿人类手动操作
sleep(0.02)
yield browser.page_source
# 解析模块
def analysis_html(html_list):
'''
:param html_list: 页面列表
:return: 返回解析出来的url_list
'''
for html in html_list:
html_tree = etree.HTML(html)
src_list = html_tree.xpath("//a/img[@class='main_img img-hover']/@src")
return src_list
# 存储模块
def save_redis(src_list):
'''
:param src_list: 图片的src 列表
:return: 将图片的 src存入redis
'''
connect = redis.StrictRedis(host='localhost', port=6379, db=1)
for src in src_list:
connect.lpush('img_src', src)
img_src = connect.lrange('img_src', 0, 9)
for img in img_src:
yield img
# 下载图片
def download(img_list):
'''
从redis数据库中取出10条src并下载到本地
:param img_list:
:return:
'''
i = 0
for src in img_list:
i += 1
src = src.decode('utf-8')
filename = './yangsimin/img%d.png' % i
request.urlretrieve(src, filename=filename)
def main():
url = 'https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F'
# 请求
html = request_html(url)
# 解析
src_list = analysis_html(html)
# # 存储
img_src = save_redis(src_list)
# 下载到本地
download(img_src)
if __name__ == '__main__':
main()
温馨提示:记得动手敲一敲哦n(*≧▽≦*)n!不记得 xpath 的同学可以复习一下 1.7 认识网页解析工具哦,还有selenium 的使用哈,嘻嘻~