对于爬虫大部分情况下都是请求头的构造很难,难就难在你必须分析js代码,看看header中有那些验证信息,这些验证信息是怎么生成的,然后再在Python中写出生成的方法,这样就能构造出正确的请求头,有了正确的请求头,就一定能请求成功,但是对于很多网站,这样的方式在过于复杂,不是一个好的解决方案,所幸的是还有一种方案是万能的,它可以爬取任何网页和任何操作,这个方案就是使用谷歌或者火狐提供的自动化测试工具,谷歌的是Chromedriver.exe,这个程序打开是一个命令框,并且它带了很多操作浏览器的命令,可以令你完全模拟人去使用网页的操作,但是这还不够,你需要将这个程序做成一个自动化的脚本,这样才能爬取大量的内容,然而在Python中已经至少有一个库实现这些,比如selenium,但事实上你也可以自己将Chromediver给封装起来,也可以使用c++将其做成一些桌面程序等等,下面给出一个Python下爬取某网站图片的例子,
首先必须先下载Chromediver.exe接着将其放入当前Python环境的script目录下即可
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import requests
from selenium.webdriver.support import wait
from selenium.webdriver.support import expected_conditions
chrome_options = webdriver.ChromeOptions()
# prefs = {
# "profile.managed_default_content_settings.images":1,
# 'profile.managed_default_content_settings.javascript':1,
# 'profile.managed_default_content_settings.css':2,
#对Chrome进行一些设置,比如关闭脚本,不加载图片等等,1-不开启;2-开启
prefs = {
'profile.default_content_setting_values': {
'images': 1,
'javascript': 2,
}
}
chrome_options.headless=True #设置无头模式,就是没有界面,也就意味着不去渲染css和style,可以价快速度
chrome_options.add_experimental_option("prefs",prefs)
for i in chrome_options.to_capabilities().items():
print(i)
browser = webdriver.Chrome(chrome_options=chrome_options)#创建一个Chromediver并传入一个设置
# browser = webdriver.Chrome()
# dcap = dict(DesiredCapabilities.PHANTOMJS) # 设置userAgent
# dcap["phantomjs.page.settings.userAgent"] = (
# "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
# browser = webdriver.PhantomJS(executable_path='phantomjs.exe', desired_capabilities=dcap) # 加载网址
# browser.set_window_size(0,0)
# browser.img
script='''
var clear=function () {
console.log('**********************')
var img_list=document.getElementsByTagName('img');
for (var i = 0; i <img_list.length;i++){
var img=img_list[i];
var url=img.getAttribute('src');
if (url !==''){
img.setAttribute('src','');
}
}
};
setInterval(clear) ;
'''
print('load 。。。。')
browser.execute_script(script)#执行屏蔽图片的脚本,也可以屏蔽其他内容,这里也可以使用谷歌的拓展插件取实现。
browser.get('http://www.taobao.com') # 打开网址
print('load finished')
# browser.set_window_size(640,320)
# browser.execute_async_script(script)
# browser.get()
browser.implicitly_wait(10)#设置网页加载的最大等待时间,并非固定时间
browser.save_screenshot("1.png") # 截图保存
print('start find......')
# print(browser.page_source)
'''开始获取数据,但是此时网页未必加载完毕,所以需要循环取判断目标元素是否加载完毕'''
import time
while 1:
a=browser.find_elements_by_class_name('img-wrapper')
print('finding...', len(a))
if len(a)>10:
for i,e in enumerate(a):
src=e.find_element_by_tag_name('img').get_property('src')
response=requests.get(src)
print(src)
with open(str(i)+'.jpg','wb') as f:
f.write(response.content)
break
time.sleep(0.5)
browser.quit() # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS,因为会有多个PhantomJS在运行状态,影响电脑性能