一、开发者工具检查网页
Chrome浏览器→“更多工具”→ “开发者工具”(F12快捷键)
Chrome提供的开发者工具如下:
Elements: 允许用户从浏览器的角度来观察网页,用户可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document
Object Model)对象。
(检查和编辑页面的HTML与CSS:选中并双击元素就可以编辑元素.
e.x.将“python”这几个字去掉,右键该元素,选择“Delete Element”)
Network:可以看到网页向服务气请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。
Source:即源代码面板,主要用来调试JavaScript。
Console:即控制台面板,可以显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。
Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。
Memory:这个面板可以提供比Performance更多的信息,比如跟踪内存泄漏。
Application:检查加载的所有资源。
Security:即安全面板,可以用来处理证书问题等。
二、基本应用
一个网络爬虫程序最普遍的过程:
1.访问站点;
2.定位所需的信息;
3.得到并处理信息。
Requests库
1.Requests库是Python中最为常用的第三方爬虫库,用它可以解决中小规模的爬取需求。简单易用,备受欢迎。
详情可见官方网站
Requests库的方法和HTTP协议的操作大多数都是对应的,因此十分易于理解
2.方法说明
request.request() 构造一个请求,支撑以下各方法的基础方法
request.get() 获取HTML网页的主要方法,对应于HTTP的GET
request.head() 获取HTML网页头信息的主要方法,对应于HTTP的HEAD
request.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
request.put() 获取HTML网页的主要方法,对应于HTTP的PUT
request.patch() 获取HTML网页的主要方法,对应于HTTP的PATCH
request.delete() 获取HTML网页的主要方法,对应于HTTP的DELETE
requests.request()
requests.request(method,url,**kwargs)
method:请求方式,对应get/put/post/head/patch/delete/options七种方法【options并不与获取资源直接相关故平时使用的比较少】
url:待获取页面的url链接
**kwargs:控制访问的参数,共13个,均为可选项。
#params:字典或字节序列,作为参数增加到url中。
mx={'key1':'value1','key2':'value2'}
r=requests.request('GET','http://python123.io/ws',params=mx)
print(r.url)
#data:字典、字节序列或文件对象,作为Request的内容【向服务器提供/提交资源时使用】
mx={'key1':'value1','key2':'value2'}
r=requests.request('POST','http://python123.io/ws',data=mx)
body='aha'
r=requests.request('POST','http://python123.io/ws',data=body)
#json:JSON格式的数据,作为Request的内容
mx={'key1':'value1','key2':'value2'}
r=requests.request('POST','http://python123.io/ws',json=mx)
#headers:字典,HTTP定制头【可用于模拟浏览器实现访问】
#cookies:字典或CookieJar,Request中的cookie
#auth:元组,支持HTTP认证功能
#files:字典类型【是向服务器传输文件时所用的字段】
#timeout:设定超时时间,以秒为单位。【规定时间内没有收到请求的内容,将产生timeout的异常】
r=requests.request('GET','http://python123.io/ws',timeout=10)
#proxies:字典类型【可以为爬取网页设定访问代理服务器,可以增加登录认证,可以隐藏用户的原ip地址信息,有效地防止对爬虫的逆追踪】
pxs={'http:':'http://user:pass@10.10.10.1:1234'
'https':'http://10.10.10.1:4321'}
r=requests.request('GET','http://www.baidu.com',proxies=pxs)
allow_redirects:True/False,默认为True,是重定向开关。
stream:True/False,默认为True,获取内容立即下载开关。
verify:True/False,默认True,认证SSL证书开关。
cert:本地SSL证书路径。
requests.get()
r:返回一个包含服务器资源的Response对象
requests.get():该函数的原型为requests.get(url,params=None,**kwargs):
url:待获取页面的url链接
params:url的额外参数,字典或字节流格式,可选;
**kwargs:12个控制访问的参数,可选。即requests.request()方法中,除了param的12个参数
requests.head()
requests.head(url,**kwargs)
url:拟爬取页面的url链接
**kwargs:12个控制访问的参数
r=requests.head('http://httpbin.org/get')
r.headers
//返回网页头的信息
r.text
requests.post()
requests.post(url,data=None,json=None,**kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,Request的内容
**kwargs:12个控制访问的参数
payload={'key1':'value1','key2':'value2'}
r.requests.post('http://httpbin.org/post',data=payload)
print(r.text)
//返回的data为空,但form表单不为空
//向URL POST一个字符串自动编码为data
r.requests.post('http://httpbin.org/post',data=‘ABC')
print(r.text)
//返回的data为Aha,form表单为空
requests.put()
requests.put(url,data=None,**kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
payload={'key1':'value1','key2':'value2'}
r.requests.put('http://httpbin.org/put',data=payload)
print(r.text)
requests.patch()
requests.patch(url,data=None,**kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
requests.delete()
requests.delete(url,**kwargs)
url:拟删除页面的url链接
**kwargs:12个控制访问的参数
#框架
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "<网址>"
print(getHTMLText(url))
#京东页面爬取
import requests
url = "https://item.jd.com/100003434260.html" # 爬取网址
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000]) # 输出字符串的前1000项
except:
print("爬取失败")
3.request库的重要对象——Response
import requests
r=requests.get("http://baidu.com")
print(r.status_code)//返回200说明连接成功,返回404说明没有找到该链接,可能是输入有误
type(r)//查看当前r的类型——Response
r.headers
//查看网页头的信息
Response对象包含服务器返回的所有信息,同时也包含了我们向服务器发送请求的Request信息。
Response对象的属性:
r.status_code:HTTP 请求的返回状态,如200,404,500等。
r.text:HTTP响应内容的字符串形式,即url对应的页面内容。
r.encoding:从HTTP的header中猜测响应内容的编码方式,如utf-8等。【如果header里面没
有设置编码格式即不存在charset,则默认返回ISO-8859-1】
r.apparent_encoding:从内容中分析出响应内容编码方式【备选编码方式,更靠谱】。
r.content:HTTP响应内容的二进制形式。
三、代码实例
1.使用request爬取”python之禅界面“
import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text
## 爬取python之禅并存入txt文件
with open('zon_of_python.txt', 'w') as f:
f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
print(text[text.find('<pre')+28:text.find('</pre>')-1])
import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])
#爬取亚马逊商品信息
url="https://www.amaZon.cn/gp/product/B01M8L5Z3Y"
try:
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[1000:2000])
except:
print("爬取失败")
#百度:关键字:wd
import requests
keyword="Python"
try:
kv={'wd':keyword} #注意关键字
r=requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text)) #输出字段长度
except:
print("爬取失败")
#360:关键字:q
import requests
keyword="Python"
try:
kv={'q':keyword} #注意关键字
r=requests.get("http://www.so.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text)) #输出字段长度
except:
print("爬取失败")
网络图片的爬取
#网络图片链接的格式:http://www.example.com/picture.jpg
#如:http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg
#单个案例
import requests
path="C:/Users/Alicecy/Desktop/abc.jpg"#存储位置及名称
url="http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg" #图片地址
r=requests.get(url)
r.status_code
200
with open(path,'wb') as f:
f.write(r.content) #以二进制的形式写入图片
112639
f.close()
#图片爬取的全代码
import requests
import os
url="http://pic32.nipic.com/20130822/2531170_213039750000_2.jpg"
root="C:/Users/Alicecy/Desktop/picture//" #在picture文件夹下保存图片
path=root+url.split('/')[-1] #’/‘后面的实际为图片的名
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已经存在")
except:
print("爬取失败")
IP地址归属地的自动查询
***手动查询:***https://m.ip138.com/iplookup.asp?ip=ipaddress
import requests
url="https://m.ip138.com/iplookup.asp?ip="
#r=requests.get(url+'202.204.80.112') #有些时候会被拒绝访问,所以就有了接下来的两行
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url+ '202.204.80.112',headers=kv)
r.text[-500:]
import requests
url="https://m.ip138.com/iplookup.asp?ip="
kv={'user-agent':'Mozilla/5.0'}
try:
r=requests.get(url+'2020.204.80.112',headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")
#爬取豆瓣top250的电影
import requests
import os
if not os.path.exists('image-test'):
os.mkdir('image-test')
def parse_html(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
text = text[text.find('alt')+3:]
item.append(extract(text))
return item
def extract(text):
text = text.split('"')
name = text[1]
image = text[3]
return name, image
def write_movies_file(item, stars):
print(item)
with open('douban_film-test.txt','a',encoding='utf-8') as f:
f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
r = requests.get(item[1])
with open('image-test/' + str(item[0]) + '.jpg', 'wb') as f:
f.write(r.content)
def main():
stars = 1
for offset in range(0, 250, 25):
url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
for item in parse_html(url):
write_movies_file(item, stars)
stars += 1
if __name__ == '__main__':
main()
相关链接:https://www.bilibili.com/video/BV1NW411V7CQ?from=search&seid=11488337299083343021
项目地址