1.目前所学爬虫的四种解析方法
Jsonpath
匹配规则:
从根节点$开始然后利用“.”来依次向下访问,可以用“..”来直接定位到需要的元素
流程:
-
导入json和jsonpath两个包
-
利用loads()方法将json文件加载成python中的字典(
B = json.loads(a) )
-
利用jsonpath的规则来提取
C = jsonpath.jsonpath( json文件的字典类型名字,规则)
代码:
正则表达式
匹配规则:
流程:
-
导入re库
-
正常从网上获取html,并转码
-
而后用re.compile()函数将正则表达式的字符串格式编译成对象并赋值出去
-
将该对象在html中去匹配,(对象名.findall(文档名))
代码:
Lxml模块的xpath
匹配规则:
nodename | 选取此节点的所有子节点。 | |
/ | 从根节点选取。 | |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 | |
. | 选取当前节点。 | |
.. | 选取当前节点的父节点。 | |
@ | 选取属性。 | |
通配符 | 描述 | |
* | 匹配任何元素节点。 | |
@* | 匹配任何属性节点。 | |
node() | 匹配任何类型的节点。 |
流程:
-
导入lxml库的etree包和requests库。
-
正常爬取想要的网站(requests.get())。
-
然后将爬取到的html转化为utf8的形式(html=res.content.decode(‘utf8’))。
-
然后先将转换后的html文档变成xml文档利用xml=etree.HTML()方法(参数为转换的html????????
-
最后就是用xml.xpath()方法去提取数据了(此处参数为规则)
代码:
Beautifulsoup模块
匹配规则:xxx=bs.find_all(‘模块名’,属性_=’名字’)
惯用语句流程:
-
从bs4导入BeautifulSoup
-
用resquests访问网站获得响应
-
将网络响应解码成字符串形式
-
然后去解析HTML文档 运用:bs=BeautifulSoup(html,’html.parser’)html为要解析的文本,html.parser为解析器
-
然后利用匹配规则去匹配数据
代码:
-
爬虫多协程的运用
流程:
-
导入各个模块与包(声明猴子补丁)
-
.写个url列表把网址都存放进去
-
创建queue()队列对象(队列对象的作用就是将url全部添加到里面后,爬虫要爬取时才从队列队像里面拿一个网址出来爬取,故而可以达到调节一个爬虫崩掉后剩余的网址无法完成)
-
创建crawler函数(作用为:从url列表里面取出网址后访问网站获取html文档存入文件中,该类的执行体)
-
创建任务列表(普通列表)以此来存放任务,先用for循环来创建需要有多少个爬虫来执行,后用gevent.spawn()函数(参数为def函数)来创建执行某函数的任务,而后将结果赋给task后将task加入任务列表中→6.用gevent.joinall()去执行任务(参数为一个列表,就是所要执行的任务列表)
代码:
-
selenium模块(实现抓取动态网页,模拟真人操作电脑)
流程:
-
先导入包,将selenium库的webdriver包导入程序
-
如果想要不显示出来的话,就要添加无界面参数(
options=webdriver.ChromeOptions()
options.add_argument(‘--headless’)
options.add_argument(‘--no-sandbox’))
-
而后进行设置游览器引擎,如果要添加无界面的话就要把参数赋进去
browser=webdriver.Chrome()
-
用引擎调用get方法去获取服务器响应(将响应传给了引擎,此时引擎是有html数据的)
-
利用提取规则提取想要的东西
-
最后要记得关闭游览器 close()方法
(可以模拟手机去登录网站,手机端获取的源码和pc端不一样options.add_argument( '--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3') )
可以与beautifulsoup一起用更佳:
Selenium有个方法是Browser.page_source其作用为获取网页源码,获取到了html就可以用beautifulsoup去解析html然后再用匹配规则去匹配数据
代码如下:
browser.get(网址)
(中间需要给时间让selenium去加载页面)
Html=browser.page_source
Html=Html.content.decode(‘utf8’)
Bs=BeautifulSoup(html,’html.parser’)
(匹配规则)
selenium模块操作元素的常用方法:
-
clear() 清楚元素内容 ②.send_keys()模拟按键输入,自动填写表单 ③.click() 点击元素
Selenium模块的提取单个元素的方法(提取多个元素在selenium后加s):
代码: