动态爬虫之 百度图片

动态爬虫之 百度图片

针对百度图片网站所构建的反扒机制,我们如果按照正常的requests和BeautifulSoup来对网页进行解析获取,那是不会得到任何信息的。

打开网页,输入搜索信息(周杰伦)
动态爬虫之 百度图片_第1张图片
F12+F5查看源码,发现查找规律:
动态爬虫之 百度图片_第2张图片
那么,接下来,使用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)

对上述代码进行运行,可以获取到爬取页数的所有链接
动态爬虫之 百度图片_第3张图片
动态爬虫之 百度图片_第4张图片

将所有链接存储在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!!!')

动态爬虫之 百度图片_第5张图片

整个代码完成了,你会发现图片已经妥妥地躺在你的文件内

差点忘了,附上代码:https://github.com/silence0628/Spiders.git

你可能感兴趣的:(python-爬虫,源码,python编辑器)