Python爬虫开发基本知识点
概述:自动化的从网络中(网页或者app等客户端)获取数据,并保存起来的程序.
***理论上,一切可以浏览看到的数据都可以获取到.
***本质:发送正确的请求,获取想要响应。
**概述爬虫开发过程:
一,目标站点分析,准备阶段的注意事项:
如果没有robots文件,则默认网站数据允许采集
哪些目录数据可以采集,哪些不允许,否则牵扯到商业性数据他用时,有法律纠纷从该出核定。
关于robots.txt文件:文档尾部详细说明。
2,从robots.txt文件中分析网站地图
即各分类网址,但要注意有些数据不完整;
初步查看网站拥有者,域名注册者。
3,初步分析网站或app采用的页面技术
借用浏览器开发者工具或抓包工具查看数据显示,分析页面框架技术,静态还是动态。
4,估计数据量的大小,以备后期选用数据库的选型。
二,尝试突破
谷歌浏览器开发者工具;
Postman软件测试获取数据;
app尝试用fiddler手机代理测试;
2,requests模块编写简单脚本
三,突破后,准备正式框架采集,提高效率,做好反爬策略
四,上线测试服务器测试
五,优化采集效率:
**知识点梳理:
Url:请求路径、请求地址;
Method:请求方式;
Cookies:请求需要的cookie信息;
Params:请求参数;
User_Agent:简称UA,浏览器信息;
Host:目的主机;
Referer:请求的来源;
Post和Get区别:post加密更安全,get显示在地址栏不安全;
数据量不同,post没有限制,get受限于浏览器地址栏内容长度限制;
发送数据方式不同,get显示在浏览器地址栏,post表单形式隐藏提交;
Get效率比post高。
Python2中:urllib负责将请求编码,urllib2负责发送请求;
Python3中:可用第三方包requests(对urllib封装过),更方便发送请求,接收响应;
用pip安装requests:pip install requests
请求携带的常用参数说明:
proxies=proxies :ip代理
timeout=10 :请求超时设置
headers=headers :请求头设置
cookies :cookies信息
url :请求地址
params :请求地址后跟的参数键值对get
json :json数据格式键值对参数 post
data :表单参数 post
stream :True:跳转后的链接继续发送请求
发送get请求演示:
Import requests
url = ‘http://xxxxxx’
proxies = {type.lower():type.lower()+’://’+ip+’:’+port} //ip代理
res = requests.get(url,params=params).text
print(res)
发送post请求:
data ={‘username’=’xxxxx’,’password’=’xxxx’}
url = ‘http://xxxxx’
text = requests.post(url,data=data).text
json = requests.post(url,data= data).json() //接收json响应数据
userinfo={"ua":"username","pw":"password"}
login=requests.post(login_url,json=userinfo)
cookies=login.cookies #获取登录后的cookies
myaddress=requests.get(myaddress_url,cookies=cookies)
3,用lxml第三方库对响应页面进行解析:
Pip install lxml
From lxml import etree
text=requests.get(‘http://xxxxx’).text
Html = etree.HTML(text) //将响应字符串文本转换为HTML文档
**xpath语法:
// : 定位根节点;
Nodename(标签名) :根据标签名定位元素;
[] :筛选元素;
@ :取一个属性值;
/ :取下级标签
text() :取标签内文本数据;
starts-with(@属性,值):该属性以某个值作为开头;
contains(@属性,值) :和not一起使用,排除掉属性不包含值的元素;
| :或,选择多个标签;
or :或,在筛选元素时用;
and :并且,在筛选元素时用
getchildren() :获取子节点:tr.getchildren()[1].text
例如:html = etree.HTML(requests.get(‘xxx’).text)
result = html.xpath(‘//div[@class=”my_div”]/a/text()’)[0] //得到序列
4,响应中携带的信息:
-- r.status_code #响应状态码:200,403
-- r.content #字节方式的响应体,会自动为你解码
-- r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
-- r.json() #Requests中内置的JSON解码器
-- r.url # 获取url
-- r.encoding # 编码格式
-- r.cookies # 获取cookie
-- r.raw #返回原始响应体
-- r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
-- r.raise_for_status() #失败请求(非200响应)抛出异常
*****Requests源码解析:
*****网站robots.txt文件解读:
robots.txt是一个纯文本文件,是搜索引擎蜘蛛爬行网站的时候要访问的第一个文件,当蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围,相当于网站与搜索引蜘蛛遵循协议,如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被屏蔽的网页。
robots的语法:
1、User-agent 定义搜索引擎。一般情况下,网站里面都是:User-agent: ,这里的意思是所有,表示定义所有的搜索引擎。比如,我想定义百度,那么就是User-agent: Baiduspider;定义google,User-agent: Googlebot。
2、Disallow 禁止爬取。如,我想禁止爬取我的admin文件夹,那就是Disallow: /admin/。禁止爬取admin文件夹下的login.html,
Disallow: /admin/login.html。
3、Allow 允许。我们都知道,在默认情况下,都是允许的。那为什么还要允许这个语法呢?举个例子:我想禁止admin文件夹下的所有文件,除了.html的网页,那怎么写呢?我们知道可以用Disallow一个一个禁止,但那样太费时间很精力了。这时候运用Allow就解决了复杂的问题,就这样写:
Allow: /admin/.html$
Disallow: /admin/。
4、$ 结束符。例:Disallow: .php$ 这句话的意思是,屏蔽所有的以.php结尾的文件,不管前面有多长的URL,如abc/aa/bb//index.php也是屏蔽的。
5、* 通配符符号0或多个任意字符。例:Disallow: ? 这里的意思是屏蔽所有带“?”文件,也是屏蔽所有的动态URL。
robots.txt文件写法举例说明
禁止Google/百度等所有搜索引擎访问整个网站
User-agent: *
Disallow: /
允许所有的搜索引擎spider访问整个网站(Disallow:可以用Allow: /替代)
User-agent: *
Disallow:
禁止Baiduspider访问您的网站,Google等其他搜索引擎不阻止
User-agent: Baiduspider
Disallow: /
只允许Google spider: Googlebot访问您的网站,禁止百度等其他搜索引擎
User-agent: Googlebot
Disallow:
User-agent: *
Disallow: /
禁止搜索引擎蜘蛛spider访问指定目录
(spider不访问这几个目录。每个目录要分开声明,不能合在一起)
User-agent: *
Disallow: /cgi-bin/
Disallow: /admin/
Disallow: /~jjjj/
禁止搜索引擎spider访问指定目录,但允许访问该指定目录的某个子目录
User-agent: *
Allow: /admin/far
Disallow: /admin/
使用通配符星号""设置禁止访问的url
(禁止所有搜索引擎抓取/cgi-bin/目录下的所有以".html"格式的网页(包含子目录))
User-agent: *
Disallow: /cgi-bin/.html
使用美元符号"$"设置禁止访问某一后缀的文件
(只允许访问以".html"格式的网页文件。)
User-agent: *
Allow: .html$
Disallow: /
阻止google、百度等所有搜索引擎访问网站中所有带有?的动态网址页面
User-agent: *
Disallow: /?
阻止Google spider:Googlebot访问网站上某种格式的图片
(禁止访问.jpg 格式的图片)
User-agent: Googlebot
Disallow: .jpg$
只允许Google spider:Googlebot抓取网页和.gif格式图片
(Googlebot只能抓取gif格式的图片和网页,其他格式的图片被禁止;
其他搜索引擎未设置)
User-agent: Googlebot
Allow: .gif$
Disallow: .jpg$
.......
只禁止Google spider:Googlebot抓取.jpg格式图片
(其他搜索引擎和其他格式图片没有禁止)
User-agent: Googlebot
Disallow: .jpg$
国内的搜索引擎蜘蛛
百度蜘蛛:baiduspider
搜狗蜘蛛:sogou spider
有道蜘蛛:YodaoBot和OutfoxBot
搜搜蜘蛛: Sosospider
国外的搜索引擎蜘蛛
google蜘蛛: googlebot
yahoo蜘蛛:Yahoo! Slurp
alexa蜘蛛:ia_archiver
bing蜘蛛(MSN):msnbot