在学习爬虫的时候,网上一大堆爬虫案例。告诉你这么写,告诉你那么写,看的眼花缭乱。
所谓爬虫,我总结出来,就两步,第一获取网页,第二查找有用信息。
但是在获取网页的时候,有的人写urlopen()方法,有的人写request.get方法,在查找有用信息的时候,有人用BeautifulSoup,有的人用xpath有的人甚至正则。
然后还把他们组合起来,一共好几种写法,看的头昏脑涨,一点规律也找不到,然后你的老师还说,找个例子模仿着写,啥也不是,让他滚开,好吧。
扯远了。。。撤回来
首先,一个简单的爬虫怎么写?
用urllib.request来写就是:
import urllib.request
import re
import os
web = urllib.request.urlopen("xxxx");#获取页面
cont = web.read() #获取页面完之后,一定要读,要不然获取的是一个response对象
pageHtml = web.decode('utf-8') #按照utf-8对象
print(pageHtml)
web.close #获取页面的方法也是流,要关的
这就获取到网页了
但是还有一种方式,我还可以这么写:
import requests
req2 = requests.get('xxxx')
print(req1.content.decode("gbk"))
其实requests是一个更高级的urllib的类,两者的作用都一样,但是就是写法不一样,让初学者很头疼,所里这里总结出来 ,推荐些requset.get,因为他简单高效。但是requsets并不是拿过来就能用,需要在cmd命令行里输入pip install
接下来是大头了。正则表达式,xpath以及BeatuifulSoup之间,三者的区别
import re
pattern = u'<a\s*href="([\u0000-\uffff&&^"]*?)"'
#pattern = u'<a[\u0000-\uffff&&^[href]]*href="([\u0000-\uffff&&^"]*?)"'
res = re.finditer(pattern,pageHtml)#pattern是正则表达式,pageHtml在上面已经有了,这个代表的是上面已经给过得解码过的那个页码
这个就简单了,直接用re包,调用的是finditer方法,而且不止是finditer,还可以说findall。但是,又来了,又要区分差别,findall取出的是一个list,直接可以用如下代码:
res = re.findall(regular expression,pageHtml)
print(res)
for r in res:
print(r)
findall是一个list,可以随时输出res这个列表,也可以随时输出里面的每一个元素。那我们接下来继续看看finditer吧
res = re.findall(regular expression,pageHtml)
for r in res :
print r.group(1)
finditer返回的是一个MatchObject的iterator,需要迭代并通过MatchObject的方法输出。
接下来轮到xpath和etree的配合使用。因为xpath需要配合etree来使用吗,所以这是一个整体。
url = requests.get("http://www.biqukan.cc/book/20461/12592815_2.html").content.decode("gbk")
# 在这里面 etree.parre和etree.HTML都是对网页进行解析,HTML方法可以解析html网页,而parse可以解析文档之类
selector = etree.HTML(url)
selector1 = etree.parse()
# 这句话是xpath中最重要的一句话,通过标签来查找到自己想要的东西
lis = selector.xpath('xxx')
for i in range(len(lis)):
print(lis[i].text)
但是在xpath中的东西怎么写:看过来
这是一个常见的HTML结构,那么我要是想要知道这个李华啥爱好呢?
看蓝色的,就一层一层的往下剥,从学生名单到爱好,最后自然就找出来了。但是如果节点太多了,我嫌写着一个一个麻烦死了怎么办?
那我就//籍贯。//这个意思就是我可以在任何位置匹配到后面任何一个想要的东西,注意是不考虑他们的位置。
最后最后最后:BeautifulSoup
from bs4 import BeautifulSoup
import urllib.request
html = urllib.request.urlopen('xxx')
html = html.read().decode("utf-8")
soup = BeautifulSoup(html)
image_list = soup.select('life_style1')
print soup.prettify()#打印soup对象的内容,格式化输出
在这其中有四大对象种类:
Tag
NavigableString
BeautifulSoup
Comment
那么在最后,xpath以及BeautifulSoup还有正则表达式。更适合什么场景,什么时候使用,首先bs4(beautifulsoup),是个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
xpath只能通过标签来获取内容。
而正则,可以获取你任何想要的内容。
但是一般的爬虫xpath就能够实现想要的功能了。