前言:自学第二天,大致搞懂,要学什么,要怎么学的问题。
与我而言,主要是针对一些库来循序渐进:requests(urllib)->BeautifulSoup(re,xpath)->selenium(PhantomJS)->scrapy
BeautifulSoup的安装:
命令提示符程序下输入:
pip install beautifulsoup4
lxml的安装:
安装没有想象的那么简单,直接如下安装会出现错误
pip install lxml
正确的姿态是这样的:
1,安装wheel,命令行运行:
pip install wheel
2,检查pip支持的版本,IDE中运行:
import pip
print(pip.pep425tags.get_supported())
3, 在这里下载对应的.whl文件,注意别改文件名!
4,进入.whl所在的文件夹(建议直接放在命令行程序最开始出现的文件夹,本人是:C:\Users\lenovo>),执行命令即可完成安装pip install 带后缀的完整文件名(本人是:lxml-3.8.0-cp36-cp36m-win32.whl)
pip install lxml-3.8.0-cp36-cp36m-win32.whl
爬虫实践:
一,BeautifulSoup的使用
详细教程点这里,
不用全部看,只用大致了解,用到的时候再查。我照着打了一部分:
print(soup.prettify()) # 格式化输出网址源码
# 打印title,用soup加标签名轻松获得标签内容,而不需要用正则表达式
print(soup.title)
print(soup.head)
print(soup.p) #只打印第一个p的部分
print(soup.div.attrs) # 打印div标签的所有属性,得到的类型是一个字典
print(soup.div['class']) # 但单独打印div的某一个部分
print(soup.title.string) # .string获得标签内部的文字
# 遍历文档树
# 直接子节点 .contents .children
print('直接子节点')
for child in soup.body.children :
print(child)
# 用来遍历
# 所有子孙节点 .descendans 包括其内部所有内容
print('所有子孙节点')
for child in soup.body.descendants:
print(child)
# 所有父节点 .parents
# 所有兄弟节点 .next_siblings .previous_siblings
# 所有前后节点 .next_elements .previous_elements
# 节点内容 .string (s)s
# 搜索文档树
# 注意:如果一个指定名字的参数不是搜索内置的参数名,
# 搜索时会把该参数当作指定名字tag的属性来搜索,
# 如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性
二,实践代码-抓取简书文章
# 爬虫利器-BeautifulSoup--抓取简书文章
# 首先导入bs4库
from bs4 import BeautifulSoup
import requests
url = 'http://www.jianshu.com/p/82833d443e76'
# 获得网址源码
html = requests.get(url).content
soup = BeautifulSoup(html, 'lxml')
print('开始抓取')
title = soup.title.string
with open(title+'.txt', 'w') as f:
href = soup.find_all('p')
try:
f.write('\t%s\r\n' %str(title)) #前面%s 后面之间空格加%内容
for hre in href:
if(hre.string!=None): #未解决标签内容回车后打印none问题
f.write('\t%s\r\n' %str(hre.string))
except Exception:
print('发生错误')
print('抓取成功')