第一次接触python,并且需要短时间内写出抓取网页内容的爬虫小工具,遇到了不少问题,在此总结一下。
主要学习了两种抓取网页的方式,beautifulsoup和lxml,个人感觉beautifulsoup定位简单,但是lxml在检索速度方面比较快,所以最终采用了lxml的方式。
1.beautifulsoup
安装
在https://www.crummy.com/software/BeautifulSoup/bs4/download/下载,放在python文件夹下,通过easy_install或pip安装
引入
from bs4 import BeautifulSoup
打开路径
html = requests.get(url ).content
soup = BeautifulSoup(html, "html.parser")
定位指定标签内容
article=soup.find('div',class_='content__body').find('article',class_='article')
寻找所有同种标签下的内容
for p in body.findAll('p'):
txt = p.get_text()
fo_txt.write(txt + "\n")
2.lxml
安装
在https://pypi.python.org/pypi/lxml/2.3下载相应版本的lxml,在命令窗口中输入pip install whl文件的全名,等待安装完成
引入
from lxml import etree
有的whl版本不包含etree所以为了方便,大家还是寻找匹配的包含etree的whl版本下载,我用的是python3.6,下载的是lxml-4.1.0-cp36-cp36m-win_amd64.whl。
打开路径
html = requests.get(url, headers=headers).content
root = etree.HTML(html.decode('utf-8', 'ignore'))
由于在抓去网页的过程中出现特殊字符,无法识别,所以编码中添加‘ignore’
定位指定标签内容
介绍常用的lxml的几个语法:
- //从匹配选择的当前节点选择文档的节点,而不考虑他们的位置(绝对路径)
root.xpath('//article[@id = "article-main"]')
寻找id属性为“article-main”的article标签
- /从根节点选取(相对路径)
article.xpath('//div[@class = "intro"]/p/text()')
p标签是div的直属子标签,text()获得p标签的内容
- . 选取当前节点
article[0].xpath('.//div[@class = "content__article-body from-content-api js-article__body"]/aside//p[@class = "pullquote-paragraph"]/text()')
从当前节点开始往下检索,尤其在使用循环抓取相同标签内的内容时,若直接使用//可能会出现一直抓取整个html中出现的第一个此标签,若使用.//则可避免这种情况
- @选取属性
article.xpath('//span[@class = "article__imgWrapper"]/img/@src')
获取img标签的src属性的内容
更多代码详情可参考我的github