爬虫工作流程:1.将种子URL放入队列 2.从队列获取URL,模拟浏览器访问URL,抓取内容 3.解析抓取的内容,将需要进一步抓取的URL放入工作队列,存储解析后的内容。(可以用文件、MySQL、SQLite、MongoDB等存储) ps:去重:Hash表,bloom过滤器

抓取策略:深度优先、广度优先、PageRank(SEO干的事儿)、大站优先

爬虫口头协议-robots协议,如www.taobao.com/robots.txt规定了哪些允许爬,哪些不允许爬

网页特点:1.都有自己唯一的URL 2.网页内容都是html结构的 3.使用的都是http、https协议

总体知识涉及:1.用到的库-urllib、request、bs4等 2.解析网页-正则表达式、bs4、xpath、jsonpath等 3.涉及到动态html-selenium+phantmjs或selenium+chromeheadless 4.scrapy框架-高性能框架使用 5.scrapy-redis组件-redis、分布式爬虫 6.爬虫、反爬虫、反反爬虫-UA、代理、验证码、动态页面等。

Client向Server发送请求是以http协议格式 ,关于http协议解释见:博客深入浅出学习HTTP协议,

http基于TCP,http请求包括:请求行、消息头、实体内容;http响应包括:状态行、消息头、实体内容。消息头中包含X-Requested-With:XMLHttpRequest代表通过ajax访问的。HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,可以利用referer防止图片盗链。我们最主要掌握http请求。

思考题:http两次连接之间有关系么,如果没有关系,你第二次登录后,服务器怎么知道你是“你”的。答案:cookie的作用。

http与https的区别见博客HTTP与HTTPS的区别。重点-https的公钥和私钥。

常用端口-http80、https443、ftp21、ssh22、mysql3306、redis6397、mongoDB27017

获取连接信息可以fiddler抓包或者用谷歌火狐的检查或开发工具。谷歌开发者工具点Network,火狐查看元素点网络。平均一个网页呈现差不多10-15个请求。XHR-ajax请求,js-js文件。。。左击一个请求,查看其Headers(请求头)、Response(相应内容)注意query string是get参数 form data是post参数。

fiddler的配置:tools->options->https 选中captures https、decrypt https trafic、ignore xxx 点击action,信任根证书 点ok关闭重启。 内容解释:<>:html内容 json、js、css不解释 一本书有一个箭头:post请求 主要关注<>、json有可能有接口  。左击一个选项,右边选择Inspectors,右上:http请求信息看raw头,右下:http相应信息点黄条解码 raw:响应的所有信息 headers:响应头 json:接口返回的内容 ps:file->capture Traffic F12可停止工具 左下黑色框可输入指令如clear;select json、image等

用到的库-urllib,主要用于模拟浏览器发送请求 python2包括urlib和urllib2两个模块;但是python3包括urllib.request和urllib.parse两个模块。

urllib.request模块主要方法:urlopen、urlretrieve

urllib.parse模块主要方法quote(url编码中文转成%xx)、unquote(url解码%xx转成中文)、urlencode(将字典转成query-string并编码)

url格式解析:url只能由字母、下划线、数字等组成,如果出现其他的入$、空格、中文等,就要对其进行编码。完整的url如http://you.ctrip.com/SearchSite/?query=%u662F在站长工具中解码是http://you.ctrip.com/SearchSite/?query=是 。代码中的url最好以'/'结尾。如我们给一个不正规的url='http://www.baidu.com/index.html?name=狗蛋&pwd=123456',对其进行编码ret=urllib.parse.quote(url) print(ret)就变成了我们看不懂的带百分号的url;使用re=urllib.parse.unquote(ret)对其进行解码

举例爬百度首页,保存到baidu.html文件中

import urllib.request

url='http://www.baidu.com'#url格式需要加http://或https://

response=urllib.request.urlopen(url=url)#返回响应对象用response接收

# response对象的方法:read().decode()将字节转成字符串
#                    geturl()根据相应内容获取请求的url
#                    getheaders()获取头部信息,列表+元组的格式[(),()]用dict()可以转换
#                    getcode()获取状态码
#                    readlines()按行读取,返回列表,都是字节类型

with open ('baidu.html','w',encoding='utf8') as fp:#若w换成wb,下面.decode()可省
    fp.write(response.read().decode())

举例爬百度图片,字节保存和retrieve方法保存两种方式

import urllib.request

#右键复制图片地址
image_url='https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1864081429,4065574611&fm=26&gp=0.jpg'

#以字节保存图片
#response=urllib.request.urlopen(url=url)
# with open('V.jpg','wb') as fp:
# 	fp.write(response.read())

#使用urllib.request.urlretrieve(url,path)一步到位保存图片
urllib.request.urlretrieve(image_url,'V1.jpg')

还是对url='http://www.baidu.com/index.html?name=狗蛋&pwd=123456'进行分析。它有两个参数name、pwd,我们向服务器发出get请求时,也要带上这两个参数,但是拼凑时需要注意:我们将url的参数以字典类型存储,如name='二狗' age= 18 data={'name':name,'age':age} 接下来可以将字典data遍历,然后将键值编码后以'='连接,键值队之间以&连接。但是我们可以用query_string=urllib.parse.urlencode(data)直接拼好,就省去了上面的步骤。

举例get方式,百度搜索

import urllib.parse
import urllib.request

word = input("请输入想搜索的内容")
url = "http://www.baidu.com/s?"
#参数写成字典
data={'ie' : 'utf-8','wd':word}

query_string = urllib.parse.urlencode(data)

url += query_string

#发送请求
response = urllib.request.urlopen(url)

filename = word + '.html'

with open(filename,'wb') as fp:
	fp.write(response.read())

UA(用户代理),可以去网上UA搜UA大全

构建请求头部--检查头部信息是反爬第一步,用请求头伪装,让服务器认为你是浏览器在上网

一般构建请求对象:

urllib.request.Request()
#自己要伪装的头部,用字典类型存储
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}
#构造请求对象
request = urllib.request.Request(url = url,headers = headers)
#发送请求
response = urllib.request.urlopen(request)
print(response.read().decode())