python爬虫基础

1. 前言

我不是专业爬虫工程师,只是业余爬点数据做做分析和挖掘工作,所以没有使用到复杂的反爬虫和线程池等技术,也没有用到beautifulSoup这样的神库。但是并不影响我轻松爬取网页数据。
这里简单记录下浏览器操作,源码读取,以及数据提取的方法,够用了。

2. selenium操作chrome浏览器

2.1. 安装chrome浏览器和浏览器驱动

首先你需要安装chrome浏览器,以及下载对应的chromedriver.exe驱动,并将chromedriver.exe驱动目录添加至path环境变量,简单的做法是将chromedriver.exe驱动放到python的安装目录即可。
chromedriver驱动和chrome的版本对应关系在每个chromedriver驱动下载目录的notes.txt文件都有说明,chromedriver驱动下载网址是:http://chromedriver.storage.googleapis.com

测试安装情况:
如果能正常打开百度说明安装成功

from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

3. selenium使用xpath定位元素

3.1. 提取数据

使用xpath定位元素是我看到的最简单也是最快的方法,没有之一,方法是,在chrome浏览器打开某个页面后,将鼠标放到某个元素(文字,链接,图片等),点击鼠标右键,选择检查,即可得到元素所在的html地址。然后我们在右键选择copy xpath即可得到元素的xpath。
得到xpath有什么用呢?太有用了,有了xpath,可以让程序获取xpath的文本信息,图片信息,超链接信息,进一步,模拟鼠标点击。

# 第1步,打开百度网页
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 第2步,获取xpath地址
# 通过刚才的方法,我们已经得到`新闻`的xpath
xpath='//*[@id="u1"]/a[1]'

# 第3步,获取xpath的内容
browser.find_element_by_xpath(xpath).text
# '新闻'

# 获取超链接
browser.find_element_by_xpath(xpath).get_property('href')
# 'http://news.baidu.com/'

如果你还不明白,请看下面两张图:
python爬虫基础_第1张图片

python爬虫基础_第2张图片

3.2. 浏览器交互

好了,接下来演示如何和浏览器交互。还是以刚才打开的百度网页为例,演示如何输入关键字并点击搜索按钮.

# 第1步,打开百度网页
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 第二步,用前面的方法找到搜索框的xpath,并输入内容
xpath='//*[@id="kw"]'
browser.find_element_by_xpath(xpath).send_keys('这是一个演示')

# 第三步 ,找到`百度一下`按钮,并模拟鼠标点击
xpath='//*[@id="su"]'
browser.find_element_by_xpath(xpath).click()

现在chrome浏览器是不是已经出现搜索结果了呢!是不是很方便呢。
用这种方法在模拟登录是很方便的,完全模拟浏览器,不用做什么浏览器头文件什么的。
当然这里没有用到复杂的session和cookies,如果你有空折腾,selenium也是很简单的。

3.3. 一些常用的浏览器交互

下面说一下一些常用的浏览器交互,除了上面的输入和点击外,还有一些常用的交互方法,比如滚动,在新标签页打开,点击等。

滚动页面
为什么要滚动页面呢,因为有些网页反爬虫很厉害,你不能看着第一行的内容却提取最后一行的内容,特别是在网页很长很长的情况下。

# 打开浏览器
from selenium.webdriver import Chrome
browser = Chrome()

# 第一种,滚动到底部
browser.execute_script(self, 'window.scrollTo(0, document.body.scrollHeight)')

# 第二种,往下滚动50像素
browser.execute_script(self, 'window.scrollTo(0, 50)')

# 第三种,滚动到xpath位置
xpath='xpath you specify'
view = browser.find_element_by_xpath(xpath)
browser.execute_script("arguments[0].scrollIntoView()", view)

在页面上点击
这里说的点击是随机点击,而不是点击具体的某一个xpath指定的元素。

# 打开浏览器
from selenium.webdriver import Chrome
from selenium.webdriver.common.action_chains import ActionChains
browser = Chrome()

# 根据x,y坐标点击页面
ActionChains(browser).move_by_offset(x, y).context_click()

在新标签页打开网页

from selenium.webdriver import Chrome
browser = Chrome()

browser.execute_script(self, 'window.open("' + url + '")')

3.4. 代理

再爬虫中不可避免地会提及代理。在selenium中设置代理也很简单,下面的演示。

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

# 设置代理参数
chrome_options = ChromeOptions()
chrome_options.add_argument('--proxy-server=http://{proxy_ip}'.format(proxy_ip=proxy_ip))
# 启动浏览器
browser = Chrome()

3.5. headless

headless,简单说就是不打开浏览器指定浏览器的相关操作,因为打开浏览器是很好资源的,如果所有的步骤都已经设置好并部署在服务器上,当然是不需要打开浏览器啊,相当于后台运行的意思。

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

# chrome参数
chrome_options = ChromeOptions()
chrome_options.add_argument('--headless')
# 启动浏览器
browser = Chrome()

3.6. selenium获取源码

这个操作是,既然已经打开网页了,那能不能将网页的源码保存下来,然后传给其他程序处理呢,比如将网页源码发给beautifulSoup解析?当时是可以的,就一句话的事情。

# 打开网页
from selenium.webdriver import Chrome
browser = Chrome()
browser.get('https://www.baidu.com')

# 获取源码
html = browser.page_source

4. lxml使用xpath提取数据

selenium很棒是不是,可以你知道吗,使用selenium操作chrome是很好资源的,而且经常出现chrome浏览器在等待网站相应,特别是js响应的时候耗费很多时间最后超时的情况,如果我们不需要特别复杂的操作,只是简单讲网页下载下来,或者说,对方网站就很简单,那就没必要用selenium了,只需要用chrome得到xpath地址,然后用lxml解析即可。

基本步骤是:
- 1.先用chrome浏览器获取元素的xpath
- 2.用request下载网页
- 3.用lxml解析xpath的元素

还是以百度为例

from lxml import etree
import requests

# 设置浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/50.0.2661.102'}
# 访问网页
r = requests.get('https://www.baidu.com/', headers=headers)
# 设置网页编码类型,一般不需要,看网站而定
r.encoding = 'utf-8'

# 重点来了,解析网页,获取xpath指定的数据
# 这个xpath是通过chrome浏览器得到的
html = etree.HTML(r.text)
xpath='//*[@id="u1"]/a[1]'

# 获取内容
tag=html.xpath(xpath)[0]
tag.text
# 获取超链接
tag.get('href')

5. 后话

好了,暂时先说到这里,相信你看完这篇文章后也能上手爬虫了,起码能爬取90%类型的互联网网页信息。
当然,爬虫也不是只有这些,反爬机制,动态加载,并发,爬虫池等等,祝你从入门到放弃。

你可能感兴趣的:(Python,数据分析)