爬虫,就是对网站发起请求,获取响应(爬取网页数据)的自动化程序 。
可以先打开一个浏览器,百度,搜索 关键字 ,会出现相关的网页,如果想要爬取网页的数据 就需要浏览器 通过F12审查元素 看到网页的html源代码。然后将链接和文字提取出等等需要的隐藏在html的信息。
可以看到左边有很多条记录,每一条记录都是请求和响应的过程(当然我们只请求了一次)。
点击一条数据,可以看在headers里面,有general(通用的请求信息,比如request url,method),response/requests headers信息。
这几个部分就是解析源代码(可以在preview的下部分看到) 呈现出的部分。
上面就是响应体中的内容了。
将响应体拿出来(也就是源代码),进行解析就好了。
直接跑代码:
import requests
response = requests.get("http://www.baidu.com")
print("response_status_code is"+str(response.status_code))
print(response.text)
response = requests.get('https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/mantpl/img/base/loading_72b1da62.gif')
print(response.content)
with open('/home/yanguokai/桌面/pachong/1.gif','wb') as f:
f.write(response.content)
f.close()
比如此处获取的就是一张图片,那么图片的URL请求地址我们可以这样轻易的获得,获得之后放在我们的request中get里面的url,然后将返回的response的context(二进制形式)写入文件,这样我们就download了一张图片。
另外如果没有看到添加请求头的话,可以这样构建一个headers字典。
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3004.3 Safari/537.36'}
response = requests.get('https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/mantpl/img/base/loading_72b1da62.gif',headers)
print(response.status_code)
with open('/home/yanguokai/桌面/pachong/1.gif','wb') as f:
f.write(response.content)
f.close()
像这种二进制文件,还有视频。只要是能请求到的,多可以获取
下面就应该来解析数据了。
很多种方法,比如直接解析html,也有很多以json返回的,都可以json解析。(在xhr显示下,结构化的json)
第一个返回的是网页源码:可以看到和我们在网页上直接看的不一样。(因为我们get到的都是第一个的源码,而很多都是js( ajax请求 调用后台接口)生成的,会覆盖以前的html)
可以看看js渲染过的代码是怎样的,
那么我们应该怎么样获取解析通过js渲染后的界面呢?
可以使用我们前面安装的库selenium 直接模拟浏览器访问,获得的源码也是渲染过后的源码,这样我们直接来解析是没有什么问题的。
这里遇到这样的问题,可能可能是没有将浏览器添加到 环境path中?是没有chrome浏览器吗?换个firefox怎么样呢?
安装chrome浏览器
sudo apt-get install libxss1 libappindicator1 libindicator7
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome*.deb
或者安装chromium-browser
sudo apt-get install chromium-browser
安装没有遇到问题,继续安装chrome_driver
可以直接下载
也可以使用命令
curl http://chromedriver.storage.googleapis.com/2.9/chromedriver_linux64.zip -O
解压下载的zip文件,得到一个chromedriver程序,这个就是用来连接chrome 和 webdriver的。
unzip chromedriver_linux64.zip
这时候需要将chromedriver添加到path中,并修改执行权限,因为我们一开始报的错就是所没有在path中找到chrome。(如果是将driver放到chrome所在的文件夹中,到时候在脚本中要申明driver的路径)
sudo mv ./chromedriver /usr/local/bin/
sudo chmod a+x /usr/local/bin/chromedriver
测试配置chromedriver成功,会出现如下的结果。
可以跑程序了
为什么没有打开正常的页面呢?,里面其实有两个问题,一个是显示的不受支持的命令行标记(可以通过设置chrome的option属性解决。),二个是地址栏只显示data:
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])
browser = webdriver.Chrome(chrome_options=options)
找了好久也只能是这样的情况了(说是两个版本呢不匹配,说是路径问题,估计会是options的配置问题吧,但是没有找到解决的),虽然没有了data,但是不会转到网页去。先放这,下次再解决吧。
options.add_argument("user-data-dir=/tmp/.com.google.Chrome.qtZa3O/Default")
原来是版本不匹配呢(我以为是2.9比2.2要更新些,所以直接下了一个2.9版本的,其实最新的是2.30的(2017)。)就因为这个问题(果然菜不是时间能解决的),呵呵几个小时过去了。
总结起来爬虫有基本四步,
第一步:发起请求
通过http库像网站 发起request(通常包含额外的head信息,可以模拟浏览器请求)请求。
request中内容:
1.请求方式 :主要有 get, post(其他的不怎么用)
get请求是将所有的参数信息放在请求的url里面。(在url中会被url编码,但是还是同样的)
那么像一些重要的参数比如密码之类的就不适合暴露在url中,所以使用post方法需要构造一个表单。
post方法里 有额外的formdata,将请求的信息存放在这个里面。
第二步:获取响应
网站接受到请求之后,通常会反馈响应 response,response的类型可能是html,json,或者是其他的,内容便是页面请求的内容。
第三步:保存数据
将返回的response内容进行保存,同样的保存的格式也不统一,存为文本,存为数据库,保存特定格式。
第四步:解析数据
一般是清理垃圾(没用的),抽取精华(需要的)。通常获取的内容是html(json,二进制),那么就可以用正则表达式,网页解析工具,等进行解析。