八月份课堂--Python爬虫(Spider)基础

一、爬虫(Spider)

 爬虫步骤 
网页抓取,数据提取,数据存储

请求网站,提取网页内容的最大化程序。获取到的是html代码,需要从这些文本中提取需要的数据。

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。SSL在传输层对网络连接进行加密

公众平台接口不再支持http方式调用,在 2017年12月30日 后所有网站都必须是 HTTPS 方式调用

URL(统一资源定位符)基本格式:

基本格式:scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme:协议。如:http、https、ftp
host:服务器的IP地址or域名。如:192.168.0.11
port#:服务器的端口。(http默认端口为80,https默认端口为443)
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定铺点链接地址)
 
 
GET是从服务器上获取数据,POST是向服务器传送数据。
在客户端, GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交

GET请求相当于我们在数据库中做了查询的操作,不影响数据库本身的数据。
POST请求相当于在数据库中做了修改的操作,会影响数据库本身的数据(如:注册、发帖、评论、得到积分,此时服务器资源状态发生了改变)。
 
 
简单的例子:
 https://www.cnblogs.com/zhaof/p/6910871.html
 
Python爬虫框架:python的urllib包提供了较为完整的访问网页文档的API
模拟浏览器行为,模拟user agent的行为构造合适的请求,譬如模拟用户登陆、模拟session/cookie的存储和设置。在python里都有非常优秀的第三方包帮你搞定,如Requests,mechanize
python的beautifulsoap提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理
 
例子:
import urllib.request


def getHTML(url):
request_headers = {
'Host':'www.vmall.com',
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
req = urllib.request.Request(url,headers=request_headers)
html = urllib.request.urlopen(req).read()
return html


def saveHTML(file_name, file_content):
# 注意windows文件命名的禁用符,比如 /
# with open(file_name.replace('/', '_') + ".html", "wb") as f:
with open(file_name+ ".html", "wb") as f:
# 写文件用bytes而不是str,所以要转码
f.write(file_content)


url = "https://www.vmall.com/list-111"

html = getHTML(url)
print (html)
print("网页已爬取")

saveHTML("baidu", html)
print("网页已存储至本地")





第一部分General是概要,包含请求地址,请求方式,状态码,服务器地址以及Referrer 策略。
第二部分是应答头部,是服务器返回的。
第三部分是请求头部,是客户端发送的

http响应头信息:
Content-Encoding:文档的编码信息

http请求头信息:
host:请求的资源服务器
user-agent:http客户端程序信息
accept:用户代理可请求的媒体类型
cache-control:控制缓存开关max-age=0,告诉服务器接收一个存在时间小于0s的资源
 创建 beautifulsoup 对象:
soup = BeautifulSoup(html,'html.parser')
得到了标签的内容用 .string 即可获取标签内部的文字:print soup.p.string


#!usr/bin/python
#-*- coding:utf-8 -*-
#createtime : 2019/8/19 22:10
#filename : test_html.py
#content : 爬取并保存到本地
import urllib.request
from bs4 import BeautifulSoup

def getHTML(url):
request_headers = {
'Host':'www.vmall.com',
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
req = urllib.request.Request(url,headers=request_headers)
html = urllib.request.urlopen(req).read()
return html


def saveHTML(file_name, file_content):
# 注意windows文件命名的禁用符,比如 /
# with open(file_name.replace('/', '_') + ".html", "wb") as f:
with open(file_name+ ".html", "wb") as f:
# 写文件用bytes而不是str,所以要转码
f.write(file_content)

def getImg(html):
soup = BeautifulSoup(html,'html.parser')
divtag = soup.find_all("img")
length = len(divtag)
for i in range(length):
print(divtag[i].attrs["src"])

url = "https://www.vmall.com"

html = getHTML(url)
getImg(html)
# print (html)
print("网页已爬取")

# saveHTML("huawei", html)
print("网页已存储至本地")
 
urllib.request的用法:

# 导入urllib.request库

import urllib.request

# 向指定的url发送请求,并返回服务器响应的类文件对象

response = urllib.request.urlopen("http://www.baidu.com/")

# 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串

html = response.read()

# 打印字符串

print(html)

可以设置另外两个参数:

1.data(默认为空):是伴随url提交的数据(比如post的数据),同时HTTP请求将从“GET”方式改为“POST”方式。

2.headers(默认为空):是一个字典

BeautifulSoup:

安装Beautiful Soup和lxml

lxml解析器有解析HTML和XML的功能,速度快,容错能力强

选择元素:
soup = BeautifulSoup(html,'html.parser')
print(soup.a.string)
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)

方法选择器:
find_all(name , attrs , recursive , text , **kwargs)
print(soup.find_all(name='ul'))

for ul in soup.find_all(name='ul'):
print(ul.find_all(name='li'))
for li in ul.find_all(name='li'):
print(li.string)
print(soup.find_all(text=re.compile('qq')))

find()方法,返回的是单个元素,也就是第一个匹配的元素

CSS选择器:
print(soup.select('.button-top-banner-min'))

soup.a.parent就可以获取父节点的信息
print(soup.a.parent)
print(soup.find('a',{'class': 'button-top-banner-min'}).parent)
子节点
print(soup.li.contents)

兄弟节点

soup.a.next_siblings 获取后面的兄弟节点
soup.a.previous_siblings 获取前面的兄弟节点
soup.a.next_sibling 获取下一个兄弟标签
souo.a.previous_sinbling 获取上一个兄弟标签

https://www.cnblogs.com/YanCJ/p/7392735.html

django_tables2导出表:https://github.com/jieter/django-tables2/blob/master/docs/pages/export.rst

restframe:https://github.com/fangweiren/Django-REST-framework-documentation

原文地址:https://www.cnblogs.com/liurg/p/11144325.html