简单了解python爬虫
一、什么是爬虫
1.1爬虫Spider的概念
- 爬虫用于爬取数据,又称之为数据采集程序。
- 爬取的数据来源于网络,网络中的数据可以是由Web服务器(Nginx/Apache)、数据库服务器(MySQL、Redis)、索引库(ElastichSearch) 、大数据(Hbase/Hive)、视频/图片库(FTP)、云存储等(OSS)提供的。
- 爬取的数据是公开的、非盈利的。
1.2 Python爬虫
使用Python编写的爬虫脚本(程序)可以完成定时、定量、指定目标(Web站点)的数据爬取。主要使用多(单)线程/进程、网络请求库、数据解析、数据存储、任务调度等相关技术。
#请求报文(请求头header和请求体body以空行分开)
POST/s HTTP/1.1
HOST:www.baidu.com
Content-Type:application/json
Content-Length:24
{"name":"disen","phone":"17365488888"}
#相应报文
HTTP/1.1 200 OK
Content-Type:text/html,charset=utf-8
Content-Length:300<html>
.....
</html>
二、爬虫与Web后端服务之间的关系
- 爬虫使用网络请求库,相当于客户端请求,Web后端服务根据请求响应数据。
- 爬虫即向Web服务器发起HTTP请求,正确地接收响应数据,然后根据数据的类型(Content-Type)进行数据的解析及存储。
- 爬虫程序在发起请求前,需要伪造浏览器(User-Agent指定请求头),然后再向服务器发起请求,响应200的成功率高很多。|
三、Python爬虫技术的相关库
1.网络请求:
- urllib
- requests / urllib3
- selenium(UI自动测试、动态js渲染)
- appium(手机App的爬虫或UI测试)
2.数据解析:
1.re正则
2.xpath
3.bs4
4.json
json序列化:将对象转换成字符串或字节
json反序列化:将字符串或字节转换成对象
3.数据存储:
- pymysql
- mongodb
- elasticsearch
4.多任务库:
- 多线程(threading)
- 线程队列queue
- 协程(asynio、gevent/eventlet)
5.爬虫框架
- scrapy
- scrapy-redis分布式(多机爬虫)
四、常见反爬虫的策略
-
UA (User-Agent)策略
-
登录限制(Cookie)策略
-
请求频次(IP代理)策略
-
验证码(图片-云打码,文字或物件图片选择、滑块)策略
-
动态js (Selenium/Splash/api接口)策略
初次使用urllib实现爬虫的数据请求
urllib.request.urlopen(ur1)发起get请求
urllib.parse.quote()将中文进行url编码
urllib.request.urlretrieve(url,filename)下载url保存到filename
案例:爬取漫画岛网站漫画图片
下载库:
1.通过命令pip install requests
2.通过pycharm--File | Settings | Project: Pythonwork | Project Interpreter--点击+号搜索需要的库进行添加
#导入第三方库
from urllib import response
from xml import etree
import requests
#获取网页中的数据(网页源代码)
def get_urls(url):
#反爬 爬虫来模拟浏览器
headers = {
'User - Agent': 'Mozilla/5.0(Windows NT 6.1; Win64; x64) ApplewebKit/537.36(KHTML,like Gecko) Chrome / 72.0.3626.121 Safari/537.36'
}
response = requests.get(url,headers)
# print(response.text) 获取到的网页源代码
return response.text
#获取网页图片链接(爬取的那个图片)
def html_result(text):
html = etree.HTML(text)
# print(html)
"""
<div class="main-content">
<ul>
......
<img src="http://img.manhuadao.cn/api/v1/bookcenter/scenethumbnail/1/168407/U_01f7e72e-c343-4688-8a5f-2049c77d73b9.jpg" alt="">
....
</div>
// 可以提取某个标签的所有信息
@ 选取属性
/ 选择某一个便签
"""
#获取所有属性class的值为main-content的div便签下的类
html.xpath('//div[@class="main-content"]//img/@src')
return img_urls
#下载网页当中的数据
def get_img(url,name):
#请求下载地址
reaponse = requests.get(url)
#开始下载:%s 占位符,%name get_img(u,image_name3),wb:以二进制的方式写入图片
with open("D:\img\%s.jpg"%name"wd") as f:
f.write(response.content)
#定义一个函数来调用这3个功能
def main():
url = 'https://www.manhuadao.cn/Comic/ComicView?comicid=58ddb12627a7c1392c23c427&chapterid=2182076'
#调用第一个函数
result = get_urls(url)
#调用第二个函数
html_result(result)
#循环遍历图片
for u in image_urls:
'''
<img src="http://img.manhuadao.cn/api/v1/bookcenter/scenethumbnail/1/168407/U_fea8cfad-f288-4364-83e8-348c9e3815ae.jpg" alt="">
'''
#截取数据返回个列表--倒着取
image_name = u.split('/')[-1]
#按.截取--正着取
image_name2 = image_name.split('.')[0]
# #按-截取--倒着取【348c9e3815ae】
image_name3 = image_name2.split('-')[-1]
get_img(u,image_name3)
print(image_name3)
#执行程序:执行判断:不会受到外面的干扰或其他程序错误调用你自己的测试程序
if __name__ == '__main__':
main()
#最后爬虫完毕,这次的爬虫只能爬取一页,如果爬取多页,可以用列表存取,如果要效率更高,到后来可以使用多线程爬虫。