Python开发之爬虫基础
Posted Mr.Hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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发过去。 ‘‘‘
以上是关于Python开发之爬虫基础的主要内容,如果未能解决你的问题,请参考以下文章