因此,根据这三步,咱们要下载一些第三方库,也就是请求库,解析库,数据库.html
常常听有人说:人生苦短,我用Pythonpython
我想这大概是由于Python有众多的第三方库,别人已经写好了,你调用就完事了git
下面是爬虫所须要的一些第三方库的安装,大部分可使用pip安装,少数须要去官网下载github
pip是什么?超级爽的包管理工具,能够理解为手机上的应用商店web
Requests是一个请求库,阻塞式的.意思就是你在请求浏览器的时候,只能等,期间什么都作不了,效率很低很低的mongodb
pip install Requests #Request库安装
pip install selenium #selenium库安装
安装完selenium以后,下载ChromeDriverChromeDriver下载,其余浏览器也有驱动,可是我只用Chrome,根据你的Chrome浏览器版本下载对应的Driver,而后把Driver放到Python安装目录的Scripts目录下便可.使用where python便可查看安装目录chrome
在Python文件中输入如下,运行,会启动Chrome窗口数据库
from selenium import webdriver browser = webdriver.Chrome()
==若是弹窗一闪而退了,说明版本有问题,若是Chrome版本的Driver没有,恭喜你,遇到了和我同样的问题,缘由大概是由于新版的Chrome浏览器实现了隐藏窗口,由于你爬虫的时候,总开个浏览器窗口也不是个事==npm
上面说到,最新版的Chrome浏览器支持隐藏窗口,其实使用PhantomJS也能够实现隐藏窗口.Selenium是支持PhantomJS的,支持不一样的浏览器,很方便
PhantomJS竟然不支持pip安装,真是诧异,那就在官网下载吧.下载完成以后打开bin文件夹,有一个phantomjs.exe,仍是个小白布精灵图标好可爱~和ChromeDriver同样,把这个exe放到Python的Scripts目录便可
检测安装很简单,直接在终端打PhantomJS便可,若是进去了就ok,ctrl+d退出
from selenium import webdriver browser = webdriver.PhantomJS() browser.get('https://www.baidu.com') print (browser.current_url)
异步请求库,和Requests恰好相反,在请求的时候,在浏览器还没搭理你的时候,能够干点其余的事.在爬虫后期的代理中,用处很是大
pip install aiohttp #aiohttp官方推荐再下载两个相关库,不下也没事 #cchardet是字符编码检测库,aiodns是加速DNS解析库 pip install cchardet aiodns
安装完上面的请求库以后,咱们能够获取大量的网页数据了,可是怎么提取咱们想要的数据呢?这就要使用解析库了,很是强大
解析HTML和XML的一个解析库,支持XPath解析方式
pip install lxml
解析HTML和XML的一个解析库,具备强大的API和多样的解析样式
pip install bs4
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>Hello</p>','lxml') print (soup.p.string)
输出hello代表安装成功
==我有一个重要的提醒,在获取文本信息的时候,不要使用string,最好使用get_text()==
#BeautifulSoup初始化能够自动更正HTML格式,补全没有闭合的元素 print (soup.prettify())#以标准的缩进格式输出 print(soup.title)#标题 print(soup.title.string)#标题里面的内容 print(soup.title.name)#title的节点名称,就是title print(soup.p)#第一个p元素的内容 print(soup.p.attrs)#第一个p元素的全部属性和值 print(soup.p['class'])#第一个p元素class属性的值 print(soup.p['name'])#第一个p元素name属性的值 print(soup.p.b.string)#第一个p标签下的b标签的文本内容 print(soup.p.contents)#第一个p元素下的全部子节点,不包括孙子节点 #第一个p元素全部的子节点 print(soup.p.descendants) for i,child in enumerate(soup.p.descendants): print(i,child) print(soup.p.parent)#第一个p元素的父节点 #第一个p元素全部的父节点 print(soup.p.parents) print(list(enumerate(soup.p.parents))) print(soup.p.next_sibling)#第一个p元素的下一个兄弟节点,注意有回车的时候要写两个next_sibling print(list(enumerate(soup.p.next_siblings)))#第一个p元素后面的全部兄弟节点 print(soup.p.previous_sibling)#第一个p元素的上一个兄弟节点 print(list(enumerate(soup.p.previous_siblings)))#第一个p元素前面的全部兄弟节点 ######################################################### #下面这些是比较经常使用的,上面的了解一下便可 # 判断某个标签是否有属性,例如img标签有一个alt属性,有时候img没有alt属性,我就能够判断一下,不然出错 if img.attrs.get('alt'): soup.find(id='text-7').find_all(name='li') #根据文本查找到该标签 # 例以下面的,根据Description查找含有Description的第一个p元素 test = soup.find(lambda e: e.name == 'p' and 'Description' in e.text) # 其实若是是直接子元素的话,也可使用parent,可是这个不多用,适用状况很少 test= soup.find(text=re.compile('Description')).parent #查找某个属性为包含的标签 #标签的属性有不少值,例如img标签的alt属性,有item和img两个值,能够经过以下查找 noscript.find_all('img',attrs={'alt':re.compile('item')}) #判断属性里面是否有某个值 if 'Datasheet' in img['alt']: #替换全部的br换行符号 html = get_one_page(url) return html.replace('<br>', '').replace('<br />', '').replace('<br/>', '') #去除最后一个逗号 datasheet_url.rstrip(',') #去除关键字和空格,只要后面的内容 #例如 Function : Sensitive Gate Silicon Controlled Rectifiers #获得的就是Sensitive Gate Silicon Controlled Rectifiers return re.sub(keywords+'.*?[\s]:.*?[\s]', '', child.find(text=re.compile(keywords)).string) #返回某个符号以前的字符 import re text="K6X4008C1F-BF55 ( 32-SOP, 55ns, LL )" b=re.search('^[^\(]*(?=\()',text,re.M) if b: print(b.group(0)) print(len(b.group(0))) else: print('没有') #关键地方是,这里是匹配的( 括号须要\来转义一下 ^[^\(]*(?=\() #若是是逗号,能够写 ^[^,]*(?=,) #若是是单词,好比我想匹配Vae这个单词,以下 text='XuSong Vae hahaha' text2='VV Vae hahaha' b=re.search('^[^Vae]*(?=Vae)',text,re.M) #这个例子很重要,text是能够正则出XuSong的,可是下面的VV就正则不出来了,由于^是后面的Vae的任意一个单词,只要前面包含就不行,VV包含了V,因此就不行了,我尝试着给Vae加括号,也不行.而后我就想了一个办法,把Vae替换成逗号之类的符号不就能够了,只要是一个字符就行,以下 text='XuSong Vae hahaha' text2='VV Vae hahaha' b=re.search('^[^,]*(?=,)',text.replace('Vae',','),re.M) #一段HTML元素中去除a标签,可是保留a标签的值 return re.sub('(<\/?a.*?>)', '', description_element) #有时候想获取一段HTML元素内容,由于有的排版在,好比ul和li元素,排版是在的,若是使用text就是一串文本,换行都没了,能够这样 str(child.find(class_='ul2')) #获取到这段HTML元素以后,使用str函数变成字符串便可 #下一个兄弟元素最好使用find_next_sibling() #等待验证,和next_sibling比较一下再说 #Python爬虫数据插入到MongoDB import pymongo client = pymongo.MongoClient("mongodb://admin:test123@192.168.3.80:27017/") db = client.datasheetcafe collection = db.datasheetcafe collection.insert_one(message)
pip install pyquery
在各大网站上,不少都有图形验证码,这个时候可使用OCR来识别,OCR是光学字符识别,经过扫描字符翻译成文本.tesserocr是一个OCR的识别库
首先要安装tesserocr的核心库tesseract,必须下载,不然tesserocr安装不成功
有趣和坑爹的是,有一款同名的游戏,我Google的时候觉得是官网中招了 tesseract 同名游戏
选择一个windows版本下载安装,过程当中能够自行勾选是否添加多语言,注意,在线下多语言超级慢,安装完成以后添加一下环境变量,有两个
Path里面添加 C:\Program Files\Tesseract-OCR
新建一个环境变量TESSDATA_PREFIX C:\Program Files\Tesseract-OCR\tessdata
tesserocr仍是经过pip安装
pip install tesserocr pillow
若是安装出现了一大堆红色的,就换个方式,使用whl安装
在tesserocr whl 里面找到你对应的Python版本,下载,注意你的Python是32位是仍是64位的,下载whl以后执行
pip install C:\Users\Justin\Downloads\tesserocr-2.4.0-cp37-cp37m-win32.whl
至此,tesserocr验证码识别就安装完成了
pip install flask
运行,而后终端会出现链接,ctrl+鼠标左键点击就能够看到浏览器中出现许嵩
from flask import Flask app=Flask(__name__) @app.route("/") def hello(): return "许嵩" if __name__=="__main__": app.run()
pip install tornado
这个终端不会输出访问地址了,本身在浏览器上输入http://127.0.0.1:8888/
能看到Hello就表明成功了
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello") def make_app(): return tornado.web.Application([ (r"/",MainHandler) ]) if __name__=="__main__": app=make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
Python爬虫不只能够爬网页,也能够爬App的数据
APP的暂时不写
我直接使用requests,Beautifulsoup已经爬取了几万条数据了,爬虫的爬取量不大的话本身写是ok的,可是你会发现,爬虫的代码好多都是重复的啊,仅仅是爬虫的规则不同而已,因此,有了一点基础以后就能够开始上手框架了
这个框架我真的是无语了,都说很强大,如今是2019.7.25号,这个框架在GitHub4个月没有更新了, 我使用的时候遇到一堆问题
一堆问题啊,真坑
pip install pyspider
上面的安装pyspider会报错,提示你安装pycurl,我就奇怪了,不能整合到一块儿吗
去这个网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl
找到你对应的版本,好比个人Python是3.7.3 32bit 的就使用37,32位,以下
找到这个以后,下载,而后经过下载路径进行pip安装
pip install D:\pycurl-7.43.0.3-cp37-cp37m-win32.whl
Pycurl安装完成以后再执行上面的pyspider安装便可
这个Spider的做者,使用了async关键字,可是Python3.7版本也使用了这个async关键字.冲突了,并且这个做者如今不更新了........
手动替换一下async关键字吧,须要替换三个文件
在这三个文件夹内,记得把async关键字换成async_mod,随意换,我是起的async_mod
替换的时候区分大小写,由于里面还有CurlAsyncHTTPClient这种,不要替换乱了
问题二的async关键字替换了以后仍是报错,能够尝试下面的方法
经过pip list能够查看WsgiDAV的版本,若是版本是3的话卸载
pip uninstall WsgiDAV
而后再按照2版本的
python -m pip install wsgidav==2.4.1
还有一个地方pyspider\webui下的webdav.py,修改209行
将'domaincontroller': NeedAuthController(app), 改成 'http_authenticator':{ 'HTTPAuthenticator':NeedAuthController(app), }
这三个问题都作了的话,应该就能够启动Spider了
输入http://localhost:5000/便可看到Spider的页面