用Python能够作什么?能够作平常任务,好比自动备份你的MP3;能够作网站,不少著名的网站包括YouTube就是Python写的;能够作网络游戏的后台,不少在线游戏的后台都是Python开发的。总之就是能干不少不少事啦。css
Python固然也有不能干的事情,好比写操做系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。html
若是你是小白用户,知足如下条件:python
简单来讲互联网是由一个个站点和网络设备组成的大网,咱们经过浏览器访问站点,站点把HTML、JS、CSS代码返回给浏览器,这些代码通过浏览器解析、渲染,将丰富多彩的网页呈现咱们眼前;正则表达式
若是咱们把互联网比做一张大的蜘蛛网,数据即是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,数据库
沿着网络抓取本身的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序;编程
从技术层面来讲就是 经过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取本身须要的数据,存放起来使用;json
用户获取网络数据的方式:浏览器
方式1:浏览器提交请求--->下载网页代码--->解析成页面服务器
方式2:模拟浏览器发送请求(获取网页代码)->提取有用的数据->存放于数据库或文件中cookie
爬虫要作的就是方式2;
一、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等
Request模块缺陷:不能执行JS 和CSS 代码
二、获取响应内容
若是服务器能正常响应,则会获得一个Response
Response包含:html,json,图片,视频等
三、解析内容
解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以wb的方式写入文件
四、保存数据
数据库(MySQL,Mongdb、Redis)
文件
Request:用户将本身的信息经过浏览器(socket client)发送给服务器(socket server)
Response:服务器接收请求,分析用户发来的请求信息,而后返回数据(返回的数据中可能包含其余连接,如:图片,js,css等)
ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求而后接收Response后,是要提取其中的有用数据。
一、请求方式:
常见的请求方式:GET / POST
二、请求的URL
url全球统一资源定位符,用来定义互联网上一个惟一的资源 例如:一张图片、一个文件、一段视频均可以用url惟一肯定
url编码
https://www.baidu.com/s?wd=图片
图片会被编码(看示例代码)
网页的加载过程是:
加载一个网页,一般都是先加载document文档,
在解析document文档的时候,遇到连接,则针对超连接发起下载图片的请求
三、请求头
User-agent:请求头中若是没有user-agent客户端配置,服务端可能将你当作一个非法用户host;
cookies:cookie用来保存登陆信息
一、请求方式:
常见的请求方式:GET / POST
二、请求的URL
url全球统一资源定位符,用来定义互联网上一个惟一的资源 例如:一张图片、一个文件、一段视频均可以用url惟一肯定
url编码
https://www.baidu.com/s?wd=图片
图片会被编码(看示例代码)
网页的加载过程是:
加载一个网页,一般都是先加载document文档,
在解析document文档的时候,遇到连接,则针对超连接发起下载图片的请求
三、请求头
User-agent:请求头中若是没有user-agent客户端配置,服务端可能将你当作一个非法用户host;
cookies:cookie用来保存登陆信息
一、请求方式:
常见的请求方式:GET / POST
二、请求的URL
url全球统一资源定位符,用来定义互联网上一个惟一的资源 例如:一张图片、一个文件、一段视频均可以用url惟一肯定
url编码
https://www.baidu.com/s?wd=图片
图片会被编码(看示例代码)
网页的加载过程是:
加载一个网页,一般都是先加载document文档,
在解析document文档的时候,遇到连接,则针对超连接发起下载图片的请求
三、请求头
User-agent:请求头中若是没有user-agent客户端配置,服务端可能将你当作一个非法用户host;
cookies:cookie用来保存登陆信息
请求头须要注意的参数:
(1)Referrer:访问源至哪里来(一些大型网站,会经过Referrer 作防盗链策略;全部爬虫也要注意模拟)
(2)User-Agent:访问的浏览器(要加上不然会被当成爬虫程序)
(3)cookie:请求头注意携带
四、请求体
请求体 若是是get方式,请求体没有内容 (get请求的请求体放在 url后面参数中,直接能看到) 若是是post方式,请求体是format data ps: 一、登陆窗口,文件上传等,信息都会被附加到请求体内 二、登陆,输入错误的用户名密码,而后提交,就能够看到post,正确登陆后页面一般会跳转,没法捕捉到post
一、响应状态码
200:表明成功
301:表明跳转
404:文件不存在
403:无权限访问
502:服务器错误
二、respone header
响应头须要注意的参数:
(1)Set-Cookie:BDSVRTM=0; path=/:可能有多个,是来告诉浏览器,把cookie保存下来
(2)Content-Location:服务端响应头中包含Location返回浏览器以后,浏览器就会从新访问另外一个页面
三、preview就是网页源代码
JSO数据
如网页html,图片
二进制数据等
一、总结爬虫流程:
爬取--->解析--->存储
二、爬虫所需工具:
请求库:requests,selenium(能够驱动浏览器解析渲染CSS和JS,但有性能劣势(有用没用的网页都会加载);)
解析库:正则,beautifulsoup,pyquery
存储库:文件,MySQL,Mongodb,Redis
涉及知识:多线程多进程
计算密集型任务:使用多进程,由于能Python有GIL,多进程能够利用上CPU多核优点;
IO密集型任务:使用多线程,作IO切换节省任务执行时间(并发)
线程池
以上参考https://www.cnblogs.com/sss4/p/7809821.html
接下来动动手指,操做一下
运行平台:Windows 10
Python版本:Python3.7
IDE:pycharm
1 from urllib import request 2 3 url = 'http://www.baidu.com' 4 # page = request.Request(url) 5 # page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36') 6 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 7 page = request.Request(url, headers=headers) 8 page_info = request.urlopen(page).read().decode('utf-8') 9 print(page_info)
The urllib.request
module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
urllib.request.urlopen(url, data=None, [timeout, ]***, cafile=None, capath=None, cadefault=False, context=None)
For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse
object slightly modified.
< 出自: https://docs.python.org/3/library/urllib.request.html >
固然这个前提是咱们已经知道了这个网页是使用utf-8编码的,怎么查看网页的编码方式呢?须要人为操做,且很是简单的方法是使用使用浏览器审查元素,只须要找到head标签开始位置的chareset,就知道网页是采用何种编码的了。以下:
这样咱们就知道了这个网站的编码方式,可是这须要咱们每次都打开浏览器,并找下编码方式,显然有些费事,使用几行代码解决更加省事而且显得酷一些。
自动获取网页编码方式的方法
获取网页编码的方式有不少,我的更喜欢用第三方库的方式。
首先咱们须要安装第三方库chardet,它是用来判断编码的模块,安装方法以下图所示,只须要输入指令:
pip install chardet
直接cmd 命令行安装
下载是若是告知你要升级运行如下命令python -m pip install --upgrade pip,升级pip版本。
一下案例参考自:https://blog.csdn.net/csdn2497242041/article/details/77170746
例子1 :爬取简书网站首页文章的标题和文章连接
首先配置如今第三方,
下载安装 pip install beautifulsoup4
1 # spider 2 # author_mark 3 # -*- coding: UTF-8 -*- 4 ''' 5 # Method 1 6 import urllib.request 7 8 url = "http://www.baidu.com" 9 page_info = urllib.request.urlopen(url).read() 10 page_info = page_info.decode('utf-8') 11 print(page_info) 12 ''' 13 14 # Method 2 15 from urllib import request 16 from bs4 import BeautifulSoup 17 18 url = 'http://www.jianshu.com' 19 # page = request.Request(url) 20 # page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36') 21 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 22 page = request.Request(url, headers=headers) 23 page_info = request.urlopen(page).read().decode('utf-8')#打开Url,获取HttpResponse返回对象并读取其ResposneBody 24 # print(page_info) 25 soup = BeautifulSoup(page_info, 'html.parser') 26 titles = soup.find_all('a', 'title') # 查找全部a标签中class='title'的语句 27 ''' 28 # 打印查找到的每个a标签的string和文章连接 29 for title in titles: 30 print(title.string) 31 print("http://www.jianshu.com" + title.get('href')) 32 ''' 33 # open()是读写文件的函数,with语句会自动close()已打开文件 34 with open(r'D:\Only me\python-code-pycharm\test.txt', "w")as file: # 在磁盘以只写的方式打开/建立一个名为 test 的txt文件 35 for title in titles: 36 file.write(title.string + '\n') 37 file.write("http://www.jianshu.com" + title.get('href') + '\n\n')
例子2:爬取知乎网站的美女图片连接,并保存到本地
# -*- coding: UTF-8 -*- from urllib import request from bs4 import BeautifulSoup import re import time url = "https://www.zhihu.com/question/22918070" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} page = request.Request(url, headers=headers) html = request.urlopen(page).read().decode('utf-8') soup = BeautifulSoup(html, 'html.parser') # print("page") # 用Beautiful Soup结合正则表达式来提取包含全部图片连接(img标签中,class=**,以.jpg结尾的连接)的语句 links = soup.find_all('img', "origin_image zh-lightbox-thumb", src=re.compile(r'.jpg$')) print(links) # 设置保存图片的路径,不然会保存到程序当前路径 path = r'D:\Only me\python-code-pycharm\pic' # 路径前的r是保持字符串原始值的意思,就是说不对其中的符号进行转义 for link in links: print(link.attrs['src']) # 保存连接并命名,time.time()返回当前时间戳防止命名冲突 request.urlretrieve(link.attrs['src'], path+'\%s.jpg' % time.time()) # 使用request.urlretrieve直接将全部远程连接数据下载到本地