文章目录
一,爬虫的基本流程
1:向服务器发起请求
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器的响应。
2:获取响应内容
如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。
3:解析内容
得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成JOSN对象进行解析,可能是二进制数据,可以保存或者进一步处理
4:保存内容
保存形式多样,可以保存成文本,也可以保存至数据库,或者保存成特定格式的文件。
二,urllib库
1.它其中包含的几个模块的说明:
1:请求模块,urllib.request
2:异常处理模块,urllib.error
3:url解析模块,urllib.parse
4:robots.txt解析模块 urllib.robotparser
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。
2.基础用法
#get方式不带参数请求网页
import urllib2
request = urllib.Request('http://www.baidu.com')
#通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器的响应。
response = urllib2.request.urlopen(request)
#如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)
print(response.read().decode('utf-8'))
#read()方法把返回的数据读取出来。decode方法把对获取到的网页用utf-8解码
------------------------------------------------------------------------------------
#带参数 POST 请求
#获取一个post对象:模拟用户真实登录时使用
import urllib.parse # 解析器
data=bytes(urllib.parse.urlencode({"word":"hello"}),encoding="utf8")
#byte()方法:把里面的信息都转换为二进制
#用parse把字典用utf-8的形式解析一遍,然后封装成一个byte数组,给data
response=urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())
-----------------------------------------------------------------------------
#超时设置
response=urllib.request.urlopen("http://httpbin.org/get",timeout=1)
try:
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
# 可以设置timeout时间,即过了这个时间还没有返回数据,则报错
print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
print(e)
try:
response=urllib.request.urlopen("http://httpbin.org/get",timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason,socket.timeout):
print("TIME OUT!")
-------------------------------------------------------------------------------
#状态,响应等
print(response.status_code)#响应状态信息
print(response.status)#如果是200则表示正常的响应,被接收到了,并且正常返回了
print(response.getheaders())# getheaders()方法:获取头部信息
print(response.getheader("Server"))#getheader("...")表示得到括号内的内容,即得到头部中Server的内容
print(type(response)) #返回的响应类型
the_page = response.read()
print the_page
-------------------------------------------------------------------------------------------------------
#插入数据发送
import urllib
import urllib2
url = 'http://www.someserver.com/register.cgi'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
data = urllib.urlencode(values) #编码工作
request = urllib2.request(url, data) #发送请求的时候,同时发送数据data
response = urllib2.urlopen(request) #接受反馈信息
----------------------------------------------------------------------------------------------------
#伪装成浏览器
import urllib
url = 'http://www.someserver.com/cgi-bin/register.cgi'
ua = UserAgent()
dic={
"name":"Germey",
'location' : 'SDU'
}
data=bytes(urllib.parse.urlencode(dic),encoding="utf8")
headers={
"User-Agent":ua.random,
"Host":"httpbin.org"
}
request=urllib.request.Request(url=url,data=data,headers=headers,method="POST")
#request是封装好的一个对象
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
3.设置代理
import urllib.request
#设置代理
proxy_handler=urllib.request.ProxyHandler(
{
'http':"http://121.232.146.98:9000",
}
)
opener=urllib.request.build_opener(proxy_handler)
response=opener.open("http://www.baidu.com")
print(response.read())
4.URL解析相关
①.urlparse :url解析库
from urllib.parse import urlparse
result=urlparse("http://www.baidu.com/index.html;user?id=5#comment")
#urlparse将url内容解析返回给result
print(type(result),result)
#结果为:<class 'urllib.parse.ParseResult'>
print(result)
#结果:ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
#没有协议类型,可指定协议类型
result=urlparse("www.baidu.com/index.html;user?id=5#comment",scheme="https")
print(result)
#如果url中有协议类型,指定协议类型失效
result=urlparse("http://www.baidu.com/index.html;user?id=5#comment",scheme="https")
print(result)
#结果scheme还是为http
②urlunparse :url拼接库
from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
#结果:http://www.baidu.com/index.html;user?a=6#comment
③urlencode:把一个字典转化成get请求参数
from urllib.parse import urlencode
params={
"name":"germey",
"age":22
}
base_url="http://www.baidu.com?"
url=base_url+urlencode(params)
print(url)
#结果:http://www.baidu.com?name=germey&age=22
5,处理cookies
①cookies简介
Cookies是数据包,可以让网页具有记忆功能,在某台电脑上记忆一定的信息
Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。
当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等
Cookies的工作原理:第一次由服务器端写入到客户端的系统中。以后每次访问这个网页,都是先由客户端将Cookies发送到服务器端,再由服务器端进行判断,然后再产生HTML代码返回给客户端。通过这个原理服务器就可以根据不同用户产生不同cookies文件,这样当该用户再次访问同一个站点时就可以根据不同的cookies文件返回不同的页面信息了。
cookie具有的属性:
- name:为一个cookie的名称。
- value:为一个cookie的值。
- domain:为可以访问此cookie的域名,譬如www.baidu.com:baidu.com就是顶级域名
域名的划分:http://aaa.bbb.secode.first.com,每一个点划分为一个域名,域名从后向前一次为顶级、一级、二级等。
②获取cookies
第一种:cookie放在headers中
import urllib.request
url = "http://www.baidu.com"
headers = {"User_Agent":"自己的user-agent",
"Cookie" : "。。。。。。这里就是。。。。"
}
response = requests.get(url, headers = headers )
with open("csdn.html", "w", encoding="utf-8") as f:
f.write(response.content.decode())
#将这个页面的数据返回到了csdn.html这个文件里面
第二种:cookie字典传给cookies参数
import requests
url = "http://www.renren.com/967272361/profile"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
}
# 不带上Cookie就访问不了这个页面
cookie = "anonymid=jk63khrk-y97r4p; _r01_=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20180720/1740/main_JAWQ_0aa000000ceb195a.jpg; _ga=GA1.2.273332130.1532825428; depovince=HUN; JSESSIONID=abcE5k0CiAJDc9ESVEcuw; ick_login=026ba348-e4e9-4871-9ce3-5868b95cfdd3"
# 将上面哪个cookie转化成字典类型
cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}
#split表示切分
response = requests.get(url, headers = headers, cookies = cookie_dict)
with open("renren2.html", "w", encoding="utf-8") as f:
f.write(response.content.decode())