Python开发之爬虫基础
爬虫简介
爬虫:可以把互联网看做是一张大网,爬虫就好像是这张网里的蜘蛛,如果想得到这张网里的资源,就可以将其抓取下来。
简单来说就是请求网站并提取数据的自动化程序。
爬虫的基本流程:
- 发起请求:通过HTTP库向目标站点发送请求,即发送一个request,请求可以包含额外的headers等信息,等待服务器的响应。
- 获取响应内容:如果服务器能正常响应,会得到一个response,response的内容便是所要获取的页面内容,类型可能是HTML,JSON字符串,二进制数据等类型。
- 解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一 步的处理。
- 保存数据:保存数据的形式多样,可以保存为文本、也可以保存在数据库,或者保存成特定格式的文件。
Request和Response过程:
(1)浏览器就发送消息给该网址所在的服务器,这个过程就叫做HTTP Request
(2)服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就叫做HTTP Response
(3)浏览器收到服务器的Response信息后,会对信息进行处理并展示。
Request请求:
- 请求方式:主要是GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。
- 请求URL:URL全称是同一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一确定。
- 请求头:包含请求时的头部信息,如User-Agent、Host、Cookies等。
- 请求体:请求时额外携带的数据,如表单提交时表单数据。
Response响应:
- 响应状态:有多种响应状态,如200代表成功,301跳转,404找不到页面、502服务器错误等
- 响应头:如内容类型、内容长度、服务器信息、设置cookie等等。
- 响应体:最主要的部分,包含了请求资源的内容,如网页HTML、图片、二进制数据等。
简单实例:
import requests
response= requests.get('http://www.baidu.com')
print(response.text) # 得到响应体
print(response.headers) # 得到相应头
print(response.status_code) # 状态码
能抓什么样的数据?
- 网页文本,如HTML文档,JSON格式文本等。
- 图片,获取得到是二进制文件,保存为图片格式。
- 视频,同为二进制文件,保存为视频格式即可。
- 其它,只要是能请求到的都可以获取。
数据处理:
- 直接处理
- JSON解析
- 正则表达式
- BeautifulSoup
- PyQuery
- Xpath
怎么保存数据
- 文本,纯文本、json、Xml等
- 关系型数据库,如Mysql、Oracle等
- 非关系型数据库,MongoDB、Redis等Key-value形式存储
- 二进制文件,如图片、视频、音频等直接保存成指定格式即可。
小例子:
爬取https://www.autohome.com.cn/news/页面上的a标签的href和图片,并将图片保存于本地
import requests
from bs4 import BeautifulSoup
response = requests.get(
url='https://www.autohome.com.cn/news/'
)
response.encoding = response.apparent_encoding # 解决乱码
soup = BeautifulSoup(response.text,features='html.parser')
target = soup.find(id='auto-channel-lazyload-article')
li_list = target.find_all('li')
for i in li_list: # 每一个i就是一个soup对象,就可以使用find继续找
a = i.find('a') # 如果找不到a,调用a.attrs就会报错,所有需要判断
if a:
a_href = a.attrs.get('href')
a_href = 'http:' + a_href
print(a_href)
txt = a.find('h3').text
print(txt)
img = a.find('img').attrs.get('src')
img = 'http:' + img
print(img)
img_response = requests.get(url=img)
import uuid
filename = str(uuid.uuid4())+ '.jpg'
with open(filename,'wb') as f:
f.write(img_response.content)
简单总结:
'''
response = request.get('url')
response.text
resopnse.content
response.encoding
response.encoding = response.apparent_encoding
response.status_code
'''
'''
soup = BeautifulSoup(response.text,features='html.parser')
v1 = soup.find('div') # 找到第一个符合条件的
soup.find(id='i1')
soup.find('div',id='i1')
v2 = soup.find_all('div')
obj = v1
obj = v2[0] # 从列表中按索引取到每一个对象
obj.text
obj.attrs # 属性
'''
requests模块介绍
1、调用的方法关系
''''
requests.get()
requests.post()
requests.put()
requests.delete()
...
上面这些方法本质上都是调用的是requests.request()方法,例如:
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
'''
2、常用参数:
'''
requests.request()
- method:提交方式
- url: 提交地址
- params:在URL上传递的参数,GET,例如
requests.request(
method='GET',
url='http://www.baidu.com',
params={'username':'user','password':'pwd'}
)
# http://www.baidu.com?username=user&password=pwd
- data:在请求体里传递的数据
requests.request(
method='POST',
url='http://www.baidu.com',
data={'username':'user','password':'pwd'}
)
- json:在请求体里传递的数据
requests.request(
method='POST',
url='http://www.baidu.com',
json={'username':'user','password':'pwd'}
)
# json="{'username':'user','password':'pwd'}" 整体发送
- headers:请求头
requests.request(
method='POST',
url='http://www.baidu.com',
json={'username':'user','password':'pwd'},
headers={
'referer':'https://dig.chouti.com/',
'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
)
- cookies: cookies,一般放在headers发过去。
'''
浙公网安备 33010602011771号