大家好,我是一名大二计算机学生。面临期末,Python如期也给出了大作业----爬虫!在此之前,我和很多人一样,初次面对爬虫,对爬虫一无所知。因此,在爬取选股宝该网站的时候,做了2次尝试,收获良多,学到了很多知识,在此分享给大家一起学习。
在此声明,以下代码是在python3.7环境中写出来的。
注意:
有些网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置,而我们又想进行爬取。
解决方法:
设置一些Headers
信息(User-Agent
),模拟成浏览器去访问这些网站。
header={
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
第一次尝试——urllib:
使用python内置库函数---urllib。使用这个函数就分2种情况了,即http协议和https协议。
以下内容会用到的包。在这里一次性导入给大家看。
import urllib import ssl import re import zlib
1. http协议网站
url=http://www.baidu.com
伪装IP:req=urllib.request.Request(url,headers=header)
访问网站: response=urllib.request.urlopen(url)
得到数据: data=response.read().decode(“utf-8”)
2. https协议网站
url=https://xuangubao.cn
设置不需要安全检查:context1=ssl._create_unverified_context()
伪装IP:req=urllib.request.Request(url,headers=header)
访问网站: response=urllib.request.urlopen(url,context=context1)
得到数据: data=response.read()
有很多人会觉得很奇怪,这里为什么不用utf-8编码格式获取数据了?
如果直接用utf-8编码格式读取数据,会出现:
UnicodeDecodeError: 'utf-8' codeccan't decode byte 0x8b in position 1: invalid start byte。
因此,首先我们要判断网站返回的数据是什么?
gzipdd=response.headers.get('Content-Encoding');
Content-Encoding:服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
对于用了压缩技术的数据,我们要先解码。
data=zlib.decompress(data,16+zlib.MAX_WBITS)
data=data.decode(‘utf-8’)
以上对于两种协议的网站,还只仅限于获取数据,获取到的数据都是复杂且庞大的。这时就要利用正则表达式和BeautifulSoup库函数。
第二次尝试——selenium:
简介:
selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
背景:
爬取https://xuangubao.cn我,我只用到了自带的无界面浏览器和Firefox浏览器。
为了调试方便,更好的看到每一步的操作,介意大家使用Firefox浏览器。
定位元素的方法总结:
(1)id定位
find_element_by_id() 返回定位到第一个匹配的元素
find_elements_by_id() 返回一个列表包含符合要求的所有元素
(2)classname定位
find_element_by_class_name() 返回定位到第一个匹配的元素
find_elements_by_class_name() 返回一个列表包含符合要求的所有元素
(3)xpath定位
find_element_by_xpath() 返回定位到第一个匹配的元素
find_elements_by_xpath() 返回一个列表包含符合要求的所有元素
xpath在浏览器获取方式,如图:
1.无界面浏览器PhantomJS
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
(1)无界面浏览器,访问服务器,同样也要设置User-Agent。
dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = ( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 " )
(2)驱动无界面浏览器
driver=webdriver.PhantomJS(desired_capabilities=dcap) driver.get(url)
2.Firefox浏览器
(1)浏览器和驱动的安装
python程序要是想通过代码自动打开浏览器,必须要有Firefox浏览器和geckodriver驱动。
浏览器安装完成后,设置FirefoxBinary为浏览器的安装路径。
binary =FirefoxBinary(r'I:\MozillaFirefox\firefox.exe')
geckodriver驱动安装完成后,将驱动的路径添加到系统环境变量path中去。
(2)设置头信息中的User-Agent
dcap = dict(DesiredCapabilities.FIREFOX)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (Macintosh; Intel Mac OSX 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 "
)
(3)驱动Firefox浏览器
driver =webdriver.Firefox(desired_capabilities=dcap)
注意:
无论是有界面浏览器Firefox还是自带的无界面浏览器,获取元素和数据的方式都是一样的。
获取页面元素方法在上面已经总结,这里不再介绍。
text(): 获取元素的文本信息
获取其它属性方法 :get_attribute(" 属性 ")