爬虫--Python常用模块之requests,urllib和re
Posted 森林326
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫--Python常用模块之requests,urllib和re相关的知识,希望对你有一定的参考价值。
目录
一、爬虫的步骤
二、使用Jupyter
三、爬虫请求模块之urllib
四、爬虫请求模块之requests
五、爬虫分析之re模块
一、爬虫的步骤
1.发起请求,模拟浏览器发送一个http请求
2.获取响应的内容
3.解析内容(解析出对自己有用的部分)
a.正则表达式
b.BeautifulSoup模块
c.pyquery模块
d.selenium模块
4.保存数据
a.文本文件(txt,csv等)
b.数据库(mysql)
c.redis,mongdb(最长使用)
二、使用Jupyter
2.1.使用理由:Jupyter可以一次执行,讲结果保存到内存里,供后面python语句多次使用,避免每次调试程序,都要重新请求网页,频繁爬取某个网页,容易导致该网站封IP
2.2.windows下使用步骤:
a.安装:pip install jupyter (前提是已经安装了python3)
b.运行:jupyter notebook,浏览器自动弹出使用界面
c.右侧New-->python3,新建一个python程序
2.3.快捷键
shift + enter键 :选定行执行,执行结果保留到内存
2.4 远程连接linux下使用步骤:
a. 安装:pip install jupyter 和 pip install ipython (为了设置远程登录jupyter密码)
b. 生成配置文件 jupyter notebook --generate-config
c. 生成远程登录密码
ipython
In [1]: from notebook.auth import passwd
In [2]: passwd(\'填写远程密码\',algorithm=\'sha1\') #指定使用sha1加密方式
Enter password:
Verify password:
Out[2]: \'sha1:43b95b731276:5d330ee6f6054613b3ab4cc59c5048ff7c70f549\' #复制引号内所有内容,包含sha1,密码填在以下配置文件里
e. 编辑配置文件
vi /root/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = \'*\' #改成*号的话,允许所有任何的ip来连接 c.NotebookApp.open_browser = False #服务器端启动jupyter时,不自动打开浏览器 c.NotebookApp.port = 8889 #设置远程连接时的端口号 c.NotebookApp.password = \'sha1:43b95b731276:5d330ee6f6054613b3ab4cc59c5048ff7c70f549\' #将上面生成设置好的密码SHA1值填入,包含sha1 c.NotebookApp.allow_root =True #允许使用root登录
f.服务端启动jupyter
jupyter notebook
g. 客户端打开浏览器输入
http://remoteip:8889
2.5 Jupyter notebook使用virtualenv虚拟环境
1.进入虚拟环境 (此处默认已安装好搭建虚拟环境工具virtualenv和虚拟环境管理工具virtualenvwrapper,并且创建虚拟开发环境test02)
2. 在虚拟环境test02里安装ipykernel
pip install -i https://pypi.douban.com/simple ipykernel
3.将虚拟环境映射到jupyter notebook的浏览器界面
python -m ipykernel install --user --name 虚拟环境名 --display-name Jupyter中要显示的名字
4.在虚拟环境或者真实环境启动 jupyter notebook
jupyter notebook
5.打开浏览器(本地浏览或者远程连接,请参照上面方法)
三、爬虫请求模块之urllib
3.1 urllib介绍
Python标准库中提供了:urllib等模块以供Http请求,但是它的API能力不佳,需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务,不推荐使用,此处只是了解一下
3.2 简单使用
#方式一: import urllib.request f = urllib.request.urlopen(\'http://www.baidu.com\') result = f.read().decode(\'utf-8\') print(result) #方式二: import urllib.request req = urllib.request.Request(\'http://www.baidu.com\') response = urllib.urlopen(req) result = response.read().decode(\'utf-8\') print(result)
ps:硬要使用urllib模块,推荐使用方式二,因为req是一个Request对象,在这个对象里,可以定义请求的头部信息,这样可以把自己包装成像个浏览器发起的请求,如下面的一个例子
3.3自定义请求头信息
import urllib.request req = urllib.request.Request(\'http://www.example.com\') #自定义头部,第一个参数为关键字参数key,第二个参数为内容 req.add_header("User-Agent","Mozilla/5.0(X11;Ubuntu;Linux x86_64;rv:39.0) Gecko/20100101 Firefox/39.0") f = urllib.request.urlopen(req) result = f.read().decode(\'utf-8\') #有一个模块fake_useragent可以随机产生User-Agent信息,对于网站的反爬虫机制有一定的欺骗作用
3.4 fake_useragent使用
#1.安装pip install fake_useragent #2.基本使用 from fake_useragent import UserAgent ua = UserAgent() print(ua.chrome) #产生一个谷歌的内核字段 #常用属性 ua.chrome #产生一个谷歌的内核字段 ua.ie #随机产生ie内核字段 ua.firefox #随机产生火狐内核字段 ua.random #随机产生不同浏览器的内核字段
3.5 urllib.parse.urljoin使用
a.使用场景
遇到url地址需要拼接的时候,可以使用urllib.parse.urljoin (存在在python3) 如base=\'http://www.baidu.com\' , url = \'/pg1\' full_url = urllib.parse.urljoin(base,url) #结果如下
使parse.urljoin()细节问题
四、爬虫请求模块之requests
4.1 requests模块介绍
Requests是使用Apache2 Licensed许可证的,基于Python开发的HTTP库,其在Python内置模块的基础上进行了高度的封装,从而使得进行网络请求时,
变得美好了许多,而且使用Requests可以轻而易举的完成浏览器可以做到的任何操作
4.2 requests安装
pip3 install requests
4.3 简单使用
import requests r = requests.get(\'http://www.example.com\') print(type(r)) print (r.status_code) #服务器返回的状态码 print (r.encoding) #网站使用的编码 print (r.text) #返回的内容,字符串类型
4.4 get请求
#1.无参数实例 import requests res = requests.get(\'http://www.example.com\') print (res.url) #打印请求的url print (res.text) #打印服务器返回的内容 #2.有参数实例 import requests payload = {\'k1\':\'v1\',\'k2\':\'v2\'} res = requests.get(\'http://httpbin.org/get\',params=payload) print (res.url) print (res.text) #3.解析json import requests import json response = rquests.get(\'http://httpbin.org/get\') print (type(response.text)) #返回结果是字符串类型 pirnt (response.json()) #字符串转成json格式 print (json.loads(response.text)) #字符串转成json格式 print (type(response.json())) #json类型 #4.添加headers import requests from fake_useragent import UserAgent ua = UserAgent() #自定义请求头部信息 headers= { \'User-Agent\':ua.chrome } response = requests.get(\'http://www.zhihui.com\',headers = headers) print (response.text)
4.5 post请求
#1.基本POST实例 import requests #当headers为application/content的时候,请求实例如下: payload = {\'k1\':\'v1\',\'k2\':\'v2\'} res = requests.post(\'http://httpbin.org/post\',data = payload) print (res.text) print (type(res.headers),res.headers) print (type(res.cookies),res.cookies) print (type(res.url),res.url) print (type(res.history),res.history) #2.发送请求头和数据实例 import json import requests url = \'http://httpbin.org/post\' payload = {\'some\':\'data\'} headers = {\'content-type\':\'application/json\'} #当headers为application/json的时候,请求实例如下: res = requests.post(url,data=json.dumps(payload), headers = headers) print (res.text)
4.6关于get与post请求的差别
get请求方法参数只有params,而没有data参数,而post请求中两者都是有的
4.7 http返回代码
1 100:continue 2 101 : switching_protocols 3 102 : processing 4 103 : checkpoint 5 122 : uri_too_long , request_uri_too_long 6 7 200 : ok , okay, all_ok all_okay , all_good, \\\\o/ , \'√\' 8 201 : created 9 202 : accepted 10 203 : non_authoritative_info , non_authoritative_information 11 204 : no_content 12 205 : rest_content , reset 13 206 : partial_content, partial 14 207 :multi_status , multiple_status multi_stati multiple_stati 15 208 : already_reported 16 226 : im_used 17 18 #Redirection 19 300 :multipel_choices 20 301 : moved_permanently , moved , \\\\o- 21 302 : found 22 303 : see_other , other 23 304 : not_modified 24 305 : use_proxy 25 306 : switch_proxy 26 307 : remporay_redirect , temporary_moved , temporary 27 308 : permanent_redirect , resume_incomplete , resume #These 2 to be removed in 3.0 28 29 #client Error 30 400 :bad_request , bad 31 401 : unauthorized 32 402 : payment_required payment 33 403 : forbiden 34 404 : not_found , -o- 35 405 : method_not_allowed not_allowed 36 406 : not_acceptable 37 407 : proxy_authentication_required , proxy_auth , proxy_authentication 38 408 : request_timeout , timeout 39 409 : conflict 40 410 :gone 41 411 :length_required 42 412 : precondition_failed , precondition 43 413 : request_entity_too_large 44 414 : requests_uri_too_large 45 415 : unsupported_media_type, unsupported_media , media_type 46 416: (\'requested_range_not_satisfiable\', \'requested_range\', \'range_not_satisfiable\'), 47 417: (\'expectation_failed\',), 48 418: (\'im_a_teapot\', \'teapot\', \'i_am_a_teapot\'), 49 421: (\'misdirected_request\',), 50 422: (\'unprocessable_entity\', \'unprocessable\'), 51 423: (\'locked\',), 52 424: (\'failed_dependency\', \'dependency\'), 53 425: (\'unordered_collection\', \'unordered\'), 54 426: (\'upgrade_required\', \'upgrade\'), 55 428: (\'precondition_required\', \'precondition\'), 56 429: (\'too_many_requests\', \'too_many\'), 57 431: (\'header_fields_too_large\', \'fields_too_large\'), 58 444: (\'no_response\', \'none\'), 59 449: (\'retry_with\', \'retry\'), 60 450: (\'blocked_by_windows_parental_controls\', \'parental_controls\'), 61 451: (\'unavailable_for_legal_reasons\', \'legal_reasons\'), 62 499: (\'client_closed_request\',), 63 # Server Error. 64 500: (\'internal_server_error\', \'server_error\', \'/o\\\\\', \'✗\'), 65 501: (\'not_implemented\',), 66 502: (\'bad_gateway\',), 67 503: (\'service_unavailable\', \'unavailable\'), 68 504: (\'gateway_timeout\',), 69 505: (\'http_version_not_supported\', \'http_version\'), 70 506: (\'variant_also_negotiates\',), 71 507: (\'insufficient_storage\',), 72 509: (\'bandwidth_limit_exceeded\', \'bandwidth\'), 73 510: (\'not_extended\',), 74 511: (\'network_authentication_required\', \'network_auth\', \'network_authentication\')
4.8 获得cookies
#会话登录 import requests s = requests.Session() s.get(\'http://www.httpbin.org/cookies/set/123456789\') #设置cookies res = s.get(\'http://www.httpbin.org/cookies\') #获得cookies print (res.text) #打印cookies 此httpbin.org是通过以上方式来设置cookies #获得cookie import requests response = requests.get(\'http://www.baidu.com\') #print (\'response.cookies\') for key,value in reponse.cookies.items(): print (key + \'=\' + value) #组合key = value
4.7 SSL设置
#ssl设置 import requests from requests.packages import urllib3 urllib3.disable_warnings() res = requests.get(\'http://www.12306.cn\',verify = False) print (res.status_code) #证书认证 import requests res = requests.get(\'https://www.12306.cn\',cert=(\'/path/server.crt\',\'/path/key\')) print (res.status_code)
4.8 代理设置
import requests proxies = { "http":"http://127.0.0.1:9746", "https":"https://127.0.0.1:9924" } res = requests.get("http://www.taobao.com",proxies = procies) print (res.status_code) #有密码的代理 import requests proxies = { "https":"https://user:password@127.0.0.1:9924" } res = requests.get("http://www.taobao.com",proxies = procies) print (res.status_code)
4.9 超时时间设置与异常处理
import requests from requests.exceptions import ReadTimeout try: res = requests.get(\'http://httpbin.org/get\',timeout=0.5) except ReadTimeout: print (\'Timeout\')
4.10 案例:检测QQ是否在线
import urllib import requests from xml.etree import ElementTree as ET #使用内置模块urllib发送http请求 r = urllib.request.urlopen(\'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=3455306**\') result = r.read().decode(\'utf-8\') #使用第三方模块requests发送http请求 r = requetsts.get(\'http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=3455306**\') result = r.text #解析XML格式内容 node = ET.XML(result) #获取内容 if node.text ==\'Y\': print (\'在线\') else: print (\'离线\')
五、爬虫分析之re模块
5.1 关于re模块的使用方法
http://www.cnblogs.com/lisenlin/articles/8797892.html#1
5.2 爬虫简单案例
import requests import re from fake_useragent import UserAgent def get_page(url): ua = UserAgent() headers = { \'User-Agent\':ua.chrome, } response = requests.get(url, headers = headers) try: if response.status_code == 200: res = response.text return res return None except Exception as e: print(e) def get_movie(html): partten = \'<p.*?><a.*?>(.*?)</a></p>.*?<p.*?>(.*?)</p>.*?<p.*?>(.*?)</p>\' items = re.findall(partten, html, re.S) #print((items)) return items def write_file(items): fileMovie = open(\'movie.txt\', \'w\', encoding=\'utf8\') try: for movie in items: fileMovie.write(\'电影排名:\' + movie[0] + \'\\r\\n\') fileMovie.write(\'电影主演:\' + movie[1].strip() + \'\\r\\n\') fileMovie.write(\'上映时间:\' + movie[2] + \'\\r\\n\\r\\n\') print(\'文件写入成功...\') finally: fileMovie.close() def main(url): html = get_page(url) items = get_movie(html) write_file(items) if __name__ == \'__main__\': url = "http://maoyan.com/board/4" main(url)
以上是关于爬虫--Python常用模块之requests,urllib和re的主要内容,如果未能解决你的问题,请参考以下文章