这几天在写一个爬虫,实际上整个过程和思路很简单,难点在于繁杂的格式处理和一些未知的小问题,还有对python不太熟悉.基本上是边学边写.记录一些过程中值得记住的东西.
关于python的:
1.文件的开头要用###coding:utf-8
2.创建文件夹可以要import os
os.mkdir(r'./newdir/')
tips:字符串前加r的作用是取消后面字符串的转义.
3.创建文件的操作是
f = open(r'./1.txt','w+')
f.write('123')
text = f.read()
f.close()
其中第一步的操作中第二个参数的作用是指定读写类型.
w 以写方式打开,
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
4.异常捕获的语句体为
try:
语句块1
except:
语句块1出错时的语句块
5.用python dict得到的key:value可以直接转成json格式.
第一步要导入from json import *
第二步 生成一个dict 比如字典d
第三步 转换成json格式 js
n=
JSONEncoder().encode(d)
tips:有一些在线的json格式检测网站可以检测json格式是否正确.json是一种格式,而不是一种文件类型.他的本质还是str.所以第三步之后输出print type(jsn)得到的结果是str
关于BeautifulSoup
1.下载安装
地址:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/
安装(ubuntu)
tar -xzvf beautifulsoup4-4.2.0.tar.gz
进入解压后的目录然后执行
python setup.py build
sudo python setup.py install
除此之外还可以用install命令进行安装
直接sudo apt-get install python-bs4
然后导入时使用from bs4 import BeautifulSoup
2.使用BeautifulSoup
from bs4 import BeautifulSoup
import urllib2
url = 'http://xxxx.com'
html = urllib2.urlopen(url)
soup = BeautifulSoup(url)
divAll = soup.findAll('div')
for div in divAll:
print div
3.需要格外注意的.
对网页的抓取,BeautifulSoup可以很好很精确的抓指定标签,但是在一些时候并不能很好的抓取标签中的完整内容.这个问题曾一度让我怀疑BeautifulSoup的能力,后来查了资料才知道,原来这和BeautifulSoup没什么关系,而是解析器的问题,在默认情况下,BeautifulSoup使用html.parser这个解释器,它速度很快,但是解析力纠错力不足,有时候当出现标签嵌套和</br>混合时,及其容易错误解析.从而造成内容不全,乱码等问题.还有一个解析器,名字是lxml,这个解析器的解析力和纠错力比html.parser要强,但是面对多嵌套和</br>混合使用的时候有时候也常常犯错,最后一个是html5lib解析器,它的解析纠错能力极强,但是解析速度较慢.我们可以根据需要选取适当的解析器.
如何指定解析器呢?
在2中 soup = BeautifulSoup(html,'解析器名')其他不变就可以了.
例如. soup = BeautifulSoup(html,'html5lib')
注意html5lib这个库需要下载
sudo apt-get install python-html5lib
就可以了,然后在python中直接使用,无需import
关于抓js动态渲染页面的.
这个可以使用pyqt中的一个库,QWebkit
具体可以
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWebKitWidgets import *
不过这种方法比较慢,它相当于用一个没有界面的浏览器把页面加载进去,然后把用js动态渲染完的页面拿出来.
一般来说,可以通过读它前端的js脚本来了解它的行为,一般来说一个事件会触发一个ajax请求,分析出它的请求地址,就可以进行模拟请求得到它想要动态渲染的内容了.这方面还有很多需要研究的地方.比如如何使用审查元素当中的功能快速定位和分析js的行为.