[关闭]
@spiritnotes 2016-05-11T16:47:38.000000Z 字数 2558 阅读 2129

《Python网络数据采集》

网络采集 读书笔记


1 初见网络爬虫

使用urllib.urlopen进行简单爬取

2 复杂HTML解析

BS中的find和findall

  1. nameList = bsObj.findAll("span", {"class":"green"}
  2. for name in nameList:
  3. print(name.get_text())
  4. # keywords 使其可以有一个 与 关系过滤

其他BS对象

使用标签

正则表达式
正则表达式可以使用到beautifulSoup中用于标签的匹配和属性的匹配

  1. bsObj.findAll(“img”, {"src":re.compile("\.......")})
  2. soup.findAll(lambda tag: len(tag.attrs)==3)

获取属性 tag.attrs["src"]

3 开始采集

深网:需要登陆或禁止搜索引擎爬取的
浅网:搜索引擎可以爬去的
暗网:通过tor等工具

采集整个网站

使用scrapy采集

4 使用API

四种方法

有些API需要验证后使用,用于计费或控制使用限制,通常是使用类似令牌(token)的方式调用,将token放入调用url中或放进请求头中。大多数反馈格式为XML或JSON(使用字节更少,JS可以直接处理)。

5 存储数据

6 读取文档

互联网上处理html还有其他很多文档,txt、jpg、avi等

  1. content = bsObj.find("div", {"id","..."}).get_text()
  2. content = bytes(content, "UTF-8")
  3. content = content.decode("UTF-8")
  1. data = urlopen(...csv).read().decode('ascii', 'ignore')
  2. datafile = StringIO(data)
  3. csvReader = csv.reader(datafile)
  4. # dictReader

7 数据清洗

编写代码清洗数据

8 自然语言处理

选择不含常用词汇出现次数较多(》=3次)的n-gram语句作为摘要
使用马尔科夫模型来随机生成句子
自然语言工具包:NLTK

9 穿越网页表单与登录窗口进行采集

使用Requests库

  1. r = requests.post(url, params)
  2. new_r = requests.get(new_url, cookies=r.cookies)
  1. session = requests.Session()
  2. s = session.post(url, login_params)
  3. s = session.get(new_url ...)

10 采集Javascript

常见库

使用 selenium 和 PhantomJs 模拟执行 JS 代码

  1. from selenium import webdriver
  2. import time
  3. driver = webdriver.PhantomJS(executable_path='')
  4. driver.get(url)
  5. time.sleep(3)
  6. driver.find_element_by_id('content').text
  7. driver.page_source
  8. driver.close()
  9. element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "loadedButton")))

11 图像识别与文字处理

OCR库:光学文字识别

12 避开采集陷阱

修改请求头,使其更像浏览器
使用 selenium 和 PhantomJs 来获取cookie
driver.get_cookie()/delete_cookie()/add_cookie()/delete_all_cookie()
表单中可能具有一些隐含字段用以检测是否为抓取

避免蜜罐:通过表单中隐含字段或页面上的一些隐含img、url、文件或者任何可以被机器人读取而人不可见的内容用以判断是否机器人,进而可以进行封闭IP等操作

问题检测表

13 用爬虫测试网站

使用 unittest
使用 selenium,支持截屏

14 远程采集

使用tor和pysocks

  1. socks.set_default_proxy(socks.SOCKS, "localhost", 9150)
  2. scoket.socket = socks.socksocket
  3. urlopen(url).read()

selenium可以通过servive_args参数设置代理

互联网其实是一个用户界面不太友好的超级API

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注