BeautifulSoup
安装BeautifulSoup
$ pip install beautifulsoup4
运行BeautifulSoup
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read(), "html.parser")
print(bsObj.h1)
对于一个标签对象,可以用下面的代码获取它的全部属性:
myTag.attrs 要注意这行代码返回的是一个 Python 字典对象,可以获取和操作这些属性。比如要获取图 片的资源位置 src,可以用下面这行代码:
myImgTag.attrs["src"]
Lambda表达式 获取有两个属性的标签:
soup.findAll(lambda tag: len(tag.attrs) == 2)
虚拟环境
用虚拟环境保存库文件:
当一个 Python 库不用虚拟环境安装的时候,你实际上是全局安装它。这通常需要有管理员权限,或者以root身份安装,这个库文件对设备上的每个用户和每个项目都是存在的。这时可以选择用虚拟环境。
首先安装virtualenv:
$ pip install virtualenv
创建虚拟环境:
$ virtualenv scrapingEnv #创建一个叫作 scrapingEnv 的新环境
激活环境:
$ cd scrapingEnv/
$ source bin/activate
退出环境:
$ deactivate正则表达式
| 符号 | 含义 | 例子 | 匹配结果 |
|---|---|---|---|
| * | 匹配前面的字符、子表达式或括号里的字符0次或多次 | a*b* | aaaaaaaa,aaabbbbb, bbbbbb |
| + | 匹配前面的字符、子表达式或括号里的字符至少1次 | a+b+ | aaaaaaab,aaabbbbb, abbbbbb |
| [] | 匹配任意一个字符(相当于“任选一个”) | [A-Z]* | APPLE,CAPIT ALS, QWERTY |
| () | 表达式编组(在正则表达式的规则里编组会优先运行) | (a*b)* | aaabaab,abaaab, ababaaaaab |
| {m,n} | 匹配前面的字符、子表达式或括号里的字符 m 到 n次(包含m或n) | a{2,3}b{2,3} | aabbb,aaabbb,aabb |
| [^] | 匹配任意一个不在中括号里的字符 | [^A-Z]* | apple,lowercase, qwerty |
| | | 匹配任意一个由竖线分割的字符、子表达式(注 意是竖线,不是大字字母 I) | b(a|i|e)d | bad,bid,bed |
| . | 匹配任意单个字符(包括符号、数字和空格等) | b.d | bad,bzd,b$d,b d |
| ^ | 指字符串开始位置的字符或子表达式 | ^a | apple,asdf,a |
| \ | 转义字符(把有特殊含义的字符转换成字面形式) | \.\ | \\ | .| \ |
| $ | 经常用在正则表达式的末尾,表示“从字符串的 末端匹配”。如果不用它,每个正则表达式实际都 带着“.*”模式,只会从字符串开头进行匹配。这 个符号可以看成是 ^ 符号的反义词 | [A-Z]*[a-z]*$ | ABCabc,zzzyx,Bob |
| ?! | “不包含”。这个奇怪的组合通常放在字符或正则 表达式前面,表示字符不能出现在目标字符串里。 这个符号比较难用,字符通常会在字符串的不同 部位出现。如果要在整个字符串中全部排除某个 字符,就加上^和$符号 | ^((?![A-Z]).)*$ | no-caps-here,$ymb0ls a4e f!ne |
使用Scrapy
安装:
$ pip install Scrapy
创建新的Scrapy项目:
$ scrapy startproject wikiSpider
运行:
$ scrapy crawl article #article由spiders文件中新建的aiticleSpider.py的name = "article" 决定
更多Scrapy的用法可参见这里:http://doc.scrapy.org/en/latest/
urlopen
当使用urlopen出现如下问题时:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
解决方法如下:
import ssl
# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)
其他解决方法可参考这里
Python Requests库
Requests库是一个擅长处理那些复杂的HTTP请求、cookie、header(响应头和请求头)等内容的 Python 第三方库。
安装
$ pip install requests
提交一个基本表单
import requests
params = {'firstname': 'Ryan', 'lastname': 'Mitchell'}
r = requests.post("http://pythonscraping.com/files/processing.php", data=params) print(r.text)
提交文件和图像
import requests
files = {'uploadFile': open('../files/Python-logo.png', 'rb')}
r = requests.post("http://pythonscraping.com/pages/processing2.php",
files=files)
print(r.text)
处理cookie(使用session函数)
import requests
session = requests.Session()
params = {'username': 'username', 'password': 'password'}
s = session.post("http://pythonscraping.com/pages/cookies/welcome.php", params) print("Cookie is set to:")
print(s.cookies.get_dict())
s = session.get("http://pythonscraping.com/pages/cookies/profile.php")
print(s.text)
HTTP基本接入认证
import requests
from requests.auth import AuthBase
from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth('ryan', 'password')
r = requests.post(url="http://pythonscraping.com/pages/auth/login.php", auth=auth)
print(r.text)
采集JavaScript
在Python中用Selenium执行JavaScript。可使用pip安装Selenium。 Selenium 可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium 可与[PhantomJS] (http://phantomjs.org)结合使用。PhantomJS可从官网下载。
下面的代码用PhantomJS库创建了一个新的Selenium WebDriver,首先用WebDriver加载页面,然后暂停执行 3 秒钟,再查看页面获取(希望已经加载完成的)内容。
from selenium import webdriver
import time
driver = webdriver.PhantomJS(executable_path='PhantomJS 可执行文件的路径')
driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html") time.sleep(3)
print(driver.find_element_by_id('content').text)
driver.close()
对于重定向问题,可以从页面开始加载时就“监视”DOM 中的一个元素,然后重复调用这个元素直到 Selenium 抛出一个 StaleElementReferenceException 异常; 也就是说,元素不在页面的 DOM 里了,说明这时网站已经跳转。
图像识别与文字处理(OCR)
安装Pillow(一个python图像处理库)
pip install pillow
安装Tesseract。可使用homebrew进行安装。
brew install tesseract
通过下面的命令运行 Tesseract,读取文件并把结果写到一个文本文件中:
$tesseract text.png textoutput
当图片背景色是渐变的时候,处理结果会不是很理想,可使用python对图像处理后再进行识别。
from PIL import Image
import subprocess
def cleanFile(filePath, newFilePath):
image = Image.open(filePath)
# 对图片进行阈值过滤,然后保存
image = image.point(lambda x: 0 if x<143 else 255)
image.save(newFilePath)
# 调用系统的tesseract命令对图片进行OCR识别
subprocess.call(["tesseract", newFilePath, "output"])
# 打开文件读取结果
outputFile = open("output.txt", 'r')
print(outputFile.read())
outputFile.close()
cleanFile("text_2.jpg", "text_2_clean.png")