2018-11-13css
1.爬虫:模拟客户端(浏览器)发送网络请求,获取响应,按照规则提取数据的程序。html
模拟客户端(浏览器)发送网络请求:照着浏览器发送如出一辙的请求,获取和浏览器如出一辙的数据python
2.爬虫的数据去哪了?git
---呈现出来:展示在网页上,或者展现在app上程序员
---进行分析:从数据中 一些规律github
3.---url = 请求的协议(http/https) + 网站的域名 + 资源的路径 + 参数web
------浏览器请求url地址:ajax
---当前url对应的响应 + js + css + 图片 ---àelements中的内容redis
------爬虫请求url地址:数据库
---当前url对应的响应
------elements的内容和爬虫获取到的url地址的响应不一样,爬虫中须要以当前url地址对应的响应为准提取数据
-----当前url地址对应的响应在哪?①从network中找到当前url地址,点击response②右击“显示网页源码”
4.HTTP和HTTPS
--HTTP:超文本传输协议
-以明文的形式传输
-效率更高,但不安全
--HTTPS:HTTP + SSL(安全套接子字层)
-传输以前数据先加密,以后解密获取内容
-效率较低,可是安全
--HTTP协议之请求
-1.请求行
-2.请求头
-User_Agent:用户代理:对方服务器可以经过user_agent知道当前请求对方资源的是什么浏览器
- Cookie:用来存储用户信息的,每次请求会被携带上发送给对方的浏览器
-要获取登陆后才能访问的页面
-对方的服务器会经过Cookie来判断咱们是一个爬虫
-3.请求体(get没有,post有)
携带数据
--HTTP协议之响应
-1.响应头
- Set-Cookie:对方服务器经过该字段设置cookie到本地
-2.响应体
-url地址对应的响应
5.get请求和post请求的区别
①get请求无请求体,post有
②get请求把数据放到URL地址中
③post请求change用于登陆注册
④post请求携带的数据量比get请求大,多,经常使用于传输大文本
6.requests模块的学习
1)使用前:pip install requests
2)发送get,post请求
response = requests.get(url) #发送get请求,请求url地址对应的响应
response = requests.post(url,data={请求体的字典}) #发送post请求
response.request.url #发送请求的url地址(字符串)
response.url #response响应的url地址(字符串)
response.request.headers # 请求头(字典)
response.headers #响应头(字典)
3)response的方法
-①response.text
该方式每每会出现乱码,出现乱码使用response.encoding=”utf-8”
-②response.content.decode()
把响应的二进制字节流转化为str类型
4)获取网页源码的方法(经过下面三种方式必定能够获取到)
①response.content.decode()
②response.content.decode(“gbk”)
③response.text
5)发送header的请求:为了模拟浏览器,获取和浏览器如出一辙的内容
headers = {“”:””,””:””} #””里面能够在Response Headers里找
例如:
get请求:
import requests
url = 'http://www.baidu.com'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
response = requests.get(url, headers=headers)
# print(response)
# 获取网页的html字符串
# response.encoding = 'utf-8'
# print(response.text)
print(response.content.decode())
post请求:
import requests
url = 'https://fanyi.baidu.com/basetrans'
query_string = {'query': '人生苦短,我用python', 'from': 'zh', 'to': 'en'}
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}
response = requests.post(url, data=query_string, headers=headers)
print(response)
print(response.content.decode())
6)超时参数
requests.get(url,headers=headers,timeout=3) #3秒内必须返回响应,不然会报错
7.retrying模块的学习
pip install retrying
import requests
from retrying import retry
'''专门请求url地址的方法'''
headers = {'User-Agent'
: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}
@retry(stop_max_attempt_number=3) # 让被装饰的函数反复执行三次,三次所有报错才会报错,中间有一次正常,程序继续日后走
def _parse_url(url):
print('*'*20)
response = requests.get(url, headers=headers, timeout=5)
return response.content.decode()
def parse_url(url):
try:
html_str = _parse_url(url)
except:
html_str = None
return html_str
if __name__ == '__main__':
url = 'http://www.baidu.com'
# print(parse_url(url))
url1 = 'www.baidu.com'
print(parse_url(url1))
8.处理cookie相关的请求
-直接携带cookie请求url地址
1.cookie放在headers中:headers={“User-Agent”:”…..”,”Cookie”:”cookie字符串”}
2.cookie字典传给cookies参数:requests.get(url,cookies=cookie_dict)
-先发送post请求,获取cookie,带上cookie请求登陆后的页面
-1.session = requests.session() #session具备的方法和requests同样
-2.session.post(url,data,headers) #服务器设置在本地的cookie会保存在session中
-3.session.get(url) #会带上以前保存在session中的cookie,可以请求成功
例子:import requests
# 实例化session
session = requests.session()
# 使用session发送post请求,获取对方保存在本地的cookie
post_url = 'http://www.renren.com/PLogin.do'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"}
post_data = {'email': '15076636657', 'password': 'hjr90355'}
session.post(post_url, headers=headers, data=post_data)
# 再使用session请求登陆后的页面
url = 'http://www.renren.com/968777388'
response = session.get(url, headers=headers)
with open('renren1.html', 'w', encoding='utf-8') as f:
f.write(response.content.decode())
2018-11-17
1.数据提取方法
json
数据交换格式,看起来像python类型(列表,字典)的字符串
json.loads(json字符串) 把json字符串转化为python类型
json.dumps(字典) 把python类型转换成json字符串
json.dumps(ret1, ensure_ascii=False, indent=2)
ensure_ascii=False 让中文显示成中文
indent=2 让下一行在上一行基础上空2格
2.xpath 一门从html中提取数据的语言(谷歌浏览器有xpath helper插件:帮助咱们从elements中定位数据)
1)选择节点(标签)
/html/head/meta 可以选中html下的head下全部的meta标签
2)// 可以从任意节点开始选择
//li :当前页面下全部的li标签
/html/head//link :head下的全部的link标签
3)@符号的做用:定位元(选择具体某个元)
//div[@class='feed-infinite-wrapper']/ul/li 选择class='feed-infinite-wrapper'下的div下的ul下的li
a/@href 选择a的href的值
4)…. /a/text() 获取文本
…./a//text() 获取a下的全部文本 //div[@class='indent']/div/table//div[@class='pl2']/a//text()
3.lxml 使代码可使用xpath
from lxml import etree
import requests
url = 'https://movie.douban.com/chart'
headers = {'User-Agent'
: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
}
response = requests.get(url, headers=headers)
html_str = response.content.decode()
# print(html_str)
# 使用etree处理数据
html = etree.HTML(html_str)
# print(html) # <Element html at 0x4b86f88>
# 1.获取全部的电影的url地址
url_list = html.xpath("//div[@class='indent']//table//div[@class='pl2']/a/@href")
# print(url_list)
# 2.获取全部图片的地址
img_list = html.xpath("//div[@class='indent']//table//a[@class='nbg']/img/@src")
# print(img_list)
# 3.须要把每部电影组成一个字典,字典中是电影的各类数据,好比标题,url,地址图片,评论数,评分
# 思路:1.分组 2.每一组提取数据
ret1 = html.xpath("//div[@class='indent']/div/table")
# print(ret1) # ret1是Element对象
for table in ret1:
item = {}
# item['title'] = table.xpath(".//div[@class='pl2']/a//text()")
item['title'] = table.xpath(".//div[@class='pl2']/a/text()")[0].replace('/', '').strip()
item['href'] = table.xpath(".//div[@class='pl2']/a/@href")[0]
item['img'] = table.xpath(".//a[@class='nbg']/img/@src")[0]
item['comment_num'] = table.xpath(".//span[@class='pl']/text()")[0]
item['rating_num'] = table.xpath(".//span[@class='rating_nums']/text()")[0]
print(item)
4.基础知识点的学习
列表推导式:帮助咱们快速生成包含一堆数据的列表
[i+10 for I in range(10)] à [10,11,12….19]
[“10月{}日”.format(i) for I in range(1,10)] à [“10月1日”,” 10月2日”…” 10月9日”]
format:字符串格式化的一种方式
“第{}名”.format(1) 、“第{}名”.format([1,2,3]) 、“第{}名”.format({1,2,3})
字典推导式:帮助咱们快速生成包含一堆数据的列表字典
{i+10 : i for I in range(10)} à {10:0,11:1….19:9}
{“a{}”.format(i) : 10 for I in range(3)} à {“a0”:10,”a1”:10,”a2”:10}
三元运算符
a = 10 if 4>3 else 20 # a=10
5.最后总结
1)url
知道url地址的规律和总页码数:构造url地址的列表
2)发送请求,获取响应:request
3)提取数据
返回json字符串:json模块
返回html字符串:lxml模块配合xpath提取数据
4)保存
小项目:
from lxml import etree
import requests
import json
class QiubaiSpider:
def __init__(self):
self.url_temp = 'https://www.qiushibaike.com/8hr/page/{}/'
self.headers = {"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
}
def get_url_list(self): # 1.根据url地址的规律,构造url_list
url_list = [self.url_temp.format(i) for i in range(1,14)]
return url_list
def parse_url(self, url):
print("now parseing : ", url)
response = requests.get(url, headers=self.headers)
return response.content.decode()
def get_content_list(self, html_str):
html = etree.HTML(html_str)
# 1.分组
div_list = html.xpath("//div[@id='content-left']/div")
# print(div_list)
content_list = []
for div in div_list:
item = {}
item['author_name'] = div.xpath(".//h2/text()")[0].strip() if len(div.xpath(".//h2/text()")) > 0 else None
item['content'] = div.xpath(".//div[@class='content']/span/text()")
item['content'] = [i.strip() for i in item['content']]
item['stats_vote'] = div.xpath(".//span[@class='stats-vote']/i/text()")
item['stats_vote'] = item['stats_vote'][0] if len(item['stats_vote']) > 0 else None
item['stats_comments'] = div.xpath(".//span[@class='stats-comments']//i/text()")
item['stats_comments'] = item['stats_comments'][0] if len(item['stats_comments']) > 0 else None
item['img'] = div.xpath(".//div[@class='thumb']//img/@src")
item['img'] = "https:" + item['img'][0] if len(item['img']) > 0 else None
content_list.append(item)
return content_list
def save_content_list(self, content_list):
with open("qiubai.txt", 'a', encoding='utf-8') as f:
f.write(json.dumps(content_list, ensure_ascii=False, indent=2))
f.write('/n')
print('保存成功')
def run(self): # 实现主要逻辑
# 1.根据url地址的规律,构造url_list
url_list = self.get_url_list()
# 2.发送请求,获取响应
for url in url_list:
html_str = self.parse_url(url)
# 3.提取数据
content_list = self.get_content_list(html_str)
# 4保存
self.save_content_list(content_list)
if __name__ == '__main__':
qiubai = QiubaiSpider()
qiubai.run()
2018-11-16
1. 爬虫基本操做
爬虫 - 定向 - 非定向
1. requests
response = requests.get('http://www.autohome.com.cn/news/')
response.text
总结:
response = requests.get('URL')
response.text
response.content
response.encoding
response.apparent_encoding
response.status_code
response.cookies.get_dict()
requests.get('http://www.autohome.com.cn/news/',cookie={'xx':'xxx'})
2. beautisoup模块
pip3 install beautifulsoup4
from bs4 import BeautiSoup
soup = BeautiSoup(response.text,features='html.parser')
target = soup.find(id='auto-channel-lazyload-article')
print(target)
总结:
soup = beautifulsoup('<html>...</html>',features='html.parser')
v1 = soup.find('div') 一个
v1 = soup.find(id='i1')
v1 = soup.find('div',id='i1')
v2 = soup.find_all('div') 多个
v2 = soup.find_all(id='i1')
v2 = soup.find_all('div',id='i1')
obj = v1
obj = v2[0] 能够循环
obj.text
obj.attrs
需求二:经过程序自动登陆github
post_dict = {
"phone": '111111111',
'password': 'xxx',
'oneMonth': 1
}
response = requests.post(
url="http://dig.chouti.com/login",
data = post_dict
)
print(response.text)
cookie_dict = response.cookies.get_dict()
c. 模块详细使用(http://www.cnblogs.com/wupeiqi/articles/6283017.html博客有)
requests
- 方法关系
requests.get(.....)
requests.post(.....)
requests.put(.....)
requests.delete(.....)
requests.request('POST'...)
- 参数
request.request
- method: 提交方式
- url: 提交地址
- params: 在URL中传递的参数,GET
requests.request(
method='GET',
url= 'http://www.oldboyedu.com',
params = {'k1':'v1','k2':'v2'}
)
# http://www.oldboyedu.com?k1=v1&k2=v2
- data: 在请求体里传递的数据
requests.request(
method='POST',
url= 'http://www.oldboyedu.com',
params = {'k1':'v1','k2':'v2'},
data = {'use':'alex','pwd': '123','x':[11,2,3]}
)
请求头:
content-type: application/url-form-encod.....
请求体:
use=alex&pwd=123
- json 在请求体里传递的数据
requests.request(
method='POST',
url= 'http://www.oldboyedu.com',
params = {'k1':'v1','k2':'v2'},
json = {'use':'alex','pwd': '123'}
)
请求头:
content-type: application/json
请求体:
"{'use':'alex','pwd': '123'}"
PS: 字典中嵌套字典时使用json
- headers 请求头
requests.request(
method='POST',
url= 'http://www.oldboyedu.com',
params = {'k1':'v1','k2':'v2'},
json = {'use':'alex','pwd': '123'},
headers={
'Referer': 'http://dig.chouti.com/',
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}
)
- cookies Cookies
- files 上传文件
- auth 基本认知(headers中加入加密的用户名和密码)
- timeout 请求和响应的超市时间
- allow_redirects 是否容许重定向
- proxies 代理
- verify 是否忽略证书
- cert 证书文件
- stream 村长下大片
- session: 用于保存客户端历史访问信息
2018-11-18
1、什么是爬虫?爬虫:就是抓取网页数据的程序。
2、爬虫怎么抓取网页数据:
网页三大特征:
-1. 网页都有本身惟一的URL(统一资源定位符)来进行定位
-2. 网页都使用HTML (超文本标记语言)来描述页面信息。
-3. 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。
爬虫的设计思路:
-1. 首先肯定须要爬取的网页URL地址。
-2. 经过HTTP/HTTP协议来获取对应的HTML页面。
-3. 提取HTML页面里有用的数据:
a. 若是是须要的数据,就保存起来。
b. 若是是页面里的其余URL,那就继续执行第二步。
3、课程介绍
-2. 如何抓取HTML页面:
HTTP请求的处理,urllib、urllib二、requests处理后的请求能够模拟浏览器发送请求,获取服务器响应的文件
-3. 解析服务器响应的内容
re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery等使用某种描述性同样来给咱们须要提取的数据定义一个匹配规则,符合这个规则的数据就会被匹配。
-4. 如何采集动态HTML、验证码的处理
通用的动态页面采集:Selenium + PhantomJS(无界面):模拟真实浏览器加载js、ajax等非静态页面数据
Tesseract:机器学习库,机器图像识别系统,能够处理简单的验证码,复杂的验证码能够经过手动输入/专门的打码平台
-5 Scrapy框架:(Scrapy,Pyspider)
高定制性高性能(异步网络框架twisted),因此数据下载速度很是快,
提供了数据存储、数据下载、提取规则等组件。
-6 分布式策略 scrapy-reids:
scrapy-redis,在Scrapy的基础上添加了一套以 Redis 数据库为核心的组件。
让Scrapy框架支持分布式的功能,主要在Redis里作 请求指纹去重、请求分配、数据临时存储。
-7 爬虫 - 反爬虫 - 反反爬虫 之间的斗争:
其实爬虫作到最后,最头疼的不是复杂的页面,也是晦涩的数据,而是网站另外一边的反爬虫人员。
User-Agent、代理、验证码、动态数据加载、加密数据。
数据价值,是否值的去费劲作反爬虫。
1. 机器成本 + 人力成本 > 数据价值,就不反了,通常作到封IP就结束了。
2. 面子的战争....
爬虫和反爬虫之间的斗争,最后必定是爬虫获胜!
为何?只要是真实用户能够浏览的网页数据,爬虫就必定能爬下来!
4、根据使用场景:分为 通用爬虫 聚焦爬虫
1.通用爬虫:搜索引擎用的爬虫系统。
-1目标:就是尽量把互联网上全部的网页下载下来,放到本地服务器里造成备份,
再对这些网页作相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。
-2抓取流程:
a) 首选选取一部分已有的URL,把这些URL放到待爬取队列。
b) 从队列里取出这些URL,而后解析DNS获得主机IP,而后去这个IP对应的服务器里下载HTML页面,保存到搜索引擎的本地服务器。
以后把这个爬过的URL放入已爬取队列。
c) 分析这些网页内容,找出网页里其余的URL链接,继续执行第二步,直到爬取条件结束。
-3 搜索引擎如何获取一个新网站的URL:
1. 主动向搜索引擎提交网址:http://zhanzhang.baidu.com/linksubmit/url
2. 在其余网站里设置网站的外链。
3. 搜索引擎会和DNS服务商进行合做,能够快速收录新的网站。
DNS:就是把域名解析成IP的一种技术。
-4 通用爬虫并非万物皆可爬,它也须要遵照规则:
Robots协议:协议会指明通用爬虫能够爬取网页的权限。
Robots.txt 只是一个建议。并非全部爬虫都遵照,通常只有大型的搜索引擎爬虫才会遵照。
我们我的写的爬虫,就无论了。
-5 通用爬虫工做流程:爬取网页 - 存储数据 - 内容处理 - 提供检索/排名服务
-6 搜索引擎排名:
1. PageRank值:根据网站的流量(点击量/浏览量/人气)统计,流量越高,网站也越值钱,排名越靠前。
2. 竞价排名:谁给钱多,谁排名就高。
-7 通用爬虫的缺点:
1. 只能提供和文本相关的内容(HTML、Word、PDF)等等,可是不能提供多媒体文件(音乐、图片、视频)和二进制文件(程序、脚本)等等。
2. 提供的结果千篇一概,不能针对不一样背景领域的人提供不一样的搜索结果。
3. 不能理解人类语义上的检索。
为了解决这个问题,聚焦爬虫出现了:
聚焦爬虫:爬虫程序员写的针对某种内容的爬虫。
面向主题爬虫,面向需求爬虫:会针对某种特定的内容去爬取信息,并且会保证信息和需求尽量相关。
2018-11-19
1. 浏览器发送HTTP请求的过程:
1)当用户在浏览器的地址栏中输入一个URL并按回车键以后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
2)当咱们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
3)浏览器分析Response中的 HTML,发现其中引用了不少其余文件,好比Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
4)当全部的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
2. HTTP请求主要分为Get和Post两种方法
GET是从服务器上获取数据,POST是向服务器传送数据
GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
POST请求参数在请求体当中,消息长度没有限制并且以隐式的方式进行发送,一般用来向HTTP服务器提交量比较大的数据(好比请求中包含许多参数或者文件上传操做等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,
注意:避免使用Get方式提交表单,由于有可能会致使安全问题。 好比说在登录表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。
3. 常见状态码:
100~199:表示服务器成功接收部分请求,要求客户端继续提交其他请求才能完成整个处理过程。
200~299:表示服务器成功接收请求并已完成整个处理过程。经常使用200(OK 请求成功)。
300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、经常使用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
400~499:客户端的请求有错误,经常使用404(服务器没法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
500~599:服务器端出现错误,经常使用500(请求未完成。服务器遇到不可预知的状况)。
4. Cookie 和 Session:
服务器和客户端的交互仅限于请求/响应过程,结束以后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的连接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:经过在 客户端 记录的信息肯定用户的身份。
Session:经过在 服务器端 记录的信息肯定用户的身份。
2018-12-2
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通信,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照必定的方式进行整理排列,入队,当引擎须要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的全部Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫):它负责处理全部Responses,从中分析提取数据,获取Item字段须要的数据,并将须要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):你能够看成是一个能够自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你能够理解为是一个能够自定扩展和操做引擎和Spider中间通讯的功能组件(好比进入Spider的Responses;和从Spider出去的Requests)
2. 制做 Scrapy 爬虫 一共须要4步:
新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
明确目标 (编写items.py):明确你想要抓取的目标
制做爬虫 (spiders/xxspider.py):制做爬虫开始爬取网页
存储内容 (pipelines.py):设计管道存储爬取内容
3.项目中的各文件的做用(以:项目名mySpider为例)
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/__init__.py:这个必须有,虽然文件里没有内容
mySpider/items.py :项目的目标文件(存储数据的)
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
Python自带的模块:/usr/lib/python2.7/urllib2.py
Python的第三方模块: /usr/local/lib/python2.7/site-packages
urllib2 默认的 User-Agent:Python-urllib/2.7
User-Agent: 是爬虫和反爬虫斗争的第一步,养成好习惯,发送请求带User-Agent
response 是服务器响应的类文件,除了支持文件操做的方法外,还支持如下经常使用的方法:
# 返回 HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题
print response.getcode()
# 返回 返回实际数据的实际URL,防止重定向问题
print response.geturl()
# 返回 服务器响应的HTTP报头
print response.info()
User-Agent 历史:
Mosaic 世界上第一个浏览器:美国国家计算机应用中心
Netscape 网景:Netscape(支持框架),慢慢开始流行....(第一款支持框架的浏览器)
Microsoft 微软:Internet Explorer(也支持框架)
第一次浏览器大战:网景公司失败..消失
Mozilla 基金组织:Firefox 火狐 - (Gecko内核)(第一款浏览器内核)
User-Agent 决定用户的浏览器,为了获取更好的HTML页面效果。
IE开了个好头,你们都开就给本身披着了个 Mozilla 的外皮
Microsoft公司:IE(Trident)
Opera公司:Opera(Presto)
Mozilla基金会:Firefox(Gecko)
Linux组织:KHTML (like Gecko)
Apple公司:Webkit(like KHTML)
Google公司:Chrome(like webkit)
其余浏览器都是IE/Chrome内核
urllib 的 urlencode() 接收的参数是一个字典:
wd = {"wd" : "传智播客"}
urllib.urlencode(wd)
结果:wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2
Get 和 Post请求的区别:
Get : 请求的url会附带查询参数,
POST:请求的url不带参数
对于Get请求:查询参数在QueryString里保存
对于Post请求:查询参数在Form表单里保存
作爬虫最须要关注的不是页面信息,而是页面信息的数据来源。
AJAX 方式加载的页面,数据来源必定是JSON
拿到JSON,就是拿到了网页的数据