动态爬虫之 百度图片
·
动态爬虫之 百度图片
针对百度图片网站所构建的反扒机制,我们如果按照正常的requests和BeautifulSoup来对网页进行解析获取,那是不会得到任何信息的。
打开网页,输入搜索信息(周杰伦)
F12+F5查看源码,发现查找规律:
那么,接下来,使用requests和BeautifulSoup混合来获取我们所需要的信息,即图片链接
import requests
from bs4 import BeautifulSoup
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1517217784271_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&ctd=1517217784272%5E00_396X947&word=%E5%91%A8%E6%9D%B0%E4%BC%A6'
html = requests.get(url)
print(html)
soup = BeautifulSoup(html.text,'lxml')
# print(soup)
company_list = soup.find_all("li",class_="imgitem")
print(company_list)
结果是
<Response [200]>
[]
会发现得到 空矩阵,没有任何内容,但是在源码中是能够看见的我们所需要爬取的数据链接,此时这就是 网站采用了动态加载技术
简单的抓包技术,也是没法能够很好的解决,而下面 的方法唯一的缺陷就是 抓取速度会偏慢,,模仿浏览器行为
"""webdriver是一个模拟浏览器的文件,以及这个PhantomJS这个软件的安装和路径选择,这个可以自己百度搜查看相关使用知识"""
driver = webdriver.PhantomJS(executable_path="D:\\360Downloads\phantomJS\phantomjs-2.1.1-windows\\bin\phantomjs.exe")
driver.get("http://www.baidu.com/")
searchInput = driver.find_element_by_id('kw') #通过ID定位
searchInput.send_keys("python")
searchSubmitBtn = driver.find_element_by_id("su")
searchSubmitBtn.submit() # 模拟提交表单
# 因为百度的搜索是异步的
# 我们这里设置等待20秒
# 如果网页标题中包含了"python" 我们就认为加载成功了
WebDriverWait(driver,20).until(expected_conditions.title_contains("python"))
# print(driver.title) # python_百度搜索
html = driver.page_source
#soup = BeautifulSoup(html,'lxml')
#print(soup)
#%%
"""webdriver是一个模拟浏览器的文件,以及这个PhantomJS这个软件的安装和路径选择,这个可以自己百度搜查看相关使用知识"""
driver = webdriver.PhantomJS(executable_path="D:\\360Downloads\phantomJS\phantomjs-2.1.1-windows\\bin\phantomjs.exe")
def search(keyword,pages):
totalPages = int(pages)*20
url_keyword = urllib.parse.quote(keyword)
urls_mat = []
k = 0
for page in range(0,totalPages,20):
"""url 链接 拼接 """
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + url_keyword + '&pn=' + str(page) + '&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0'
print(url)
if url:
time.sleep(5)
driver.get(url)
bsObj = BeautifulSoup(driver.page_source, "html5lib") # 模拟浏览器 解析 网页
# print(bsObj)
company_list = bsObj.find_all("li",class_="imgitem") # 获取图片链接所在
print("*********************************************%d************************************************************************************"%k)
# print(len(company_list))
print(company_list)
for company in company_list:
link = company.img['src'] # 提取 链接
print(link)
urls_mat.append(link)
k+=1
else:
print('当前页面不存在')
return urls_mat
if __name__ == '__main__':
keywords = input('please input the key word:') # 输入图片搜索关键字
k = input('please input the crawl page:') # 输入你将要爬取的页数
urls = search(keyword=keywords,pages=k)
对上述代码进行运行,可以获取到爬取页数的所有链接
将所有链接存储在urls里面,接下来对其进行下载
"""down the pictures"""
import os
from urllib import request
import socket
socket.setdefaulttimeout(30) # socket 超时设置
nums = len(urls)
dirs = 'E:\\HHH\\Spiders\\dongTaiCrawl\\'+keywords # 目标文件夹
"""判断是否存在这个路径文件夹,如果不,就创建 """
if not os.path.isdir(dirs):
os.mkdir(dirs)
""" 下载 """
for k in range(nums):
#生成一张壁纸的地址
url = urls[k]
if url:
print(url)
#爬取一张壁纸
try:
time.sleep(1)
imagename=dirs+'\\'+keywords+'_' + str(k) + '.jpg'
request.urlretrieve(url,imagename)
except:
print(None)
else:
print('url link is error!!!')
整个代码完成了,你会发现图片已经妥妥地躺在你的文件内
更多推荐




所有评论(0)