- 使用的IDE : pycharm ce 社区版
- python lib文档 : The Python Standard Library
python3 爬虫
创建爬虫
BeautifulSoup
网络连接
1 | from urllib.request import urlopen |
BeautifulSoup
中文文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
- 安装pip
安装beautifulsoup
1
$pip3 install beautifulsoup4
使用
1
2
3
4
5from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read())
print(bsObj.h1)- 这样使用会警告
BeautifulSoup([your markup], "html.parser")
这样正确的使用。
- 这样使用会警告
处理Http异常
1 | try: |
处理beautifulSoup异常
1 | try: |
复杂HTML解析
使用beautifulSoup抓取特定css属性
1 | html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html") |
使用beautifulSoup处理html标签树
获取子标签
children()
1
2
3
4html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html)
for child in bsObj.find("table",{"id":"giftList"}).children:
print(child)获取自身之后的兄弟标签
next_siblings()
获取除了自身以外的兄弟标签,同时只能获取自身之后的兄弟标签。
1
2
3
4html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html)
for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings:
print(sibling)除此之外还有 获取自身之前的兄弟标签
previous_siblings()
、获取自身之前的单个兄弟标签previous_sibling()
、获取自身之后的单个兄弟标签next_sibling()
。
获取父标签
- parent 和 parents
正则表达式 与 BeautifulSoup
查找图片相对路径为以 ../img/gifts/img 开头,以 .jpg 结尾的图片
1 | html = urlopen("http://www.pythonscraping.com/pages/page3.html") |
获取属性
经常不需要查找标签的内容, 而是需要查找标签属性myTag.attrs
可以获取一个标签对象的全部属性。比如获取src属性:myImgTag.attrs["src"]
开始采集
遍历单个域名
找到URL链接,获取网页内容,从中找出另一个链接,然后再获取这个网页的内容,不断循环这一过程。
1 | from urllib.request import urlopen |
定义了 getLinks函数,过滤出指向其他词条的链接。再随机选择一条链接 获取新的页面,如此循环。
采集整个网站
url链接去重,打印(收集)需要信息
1 | from urllib.request import urlopen |
使用Scrapy采集
Scrapy 就是一个帮你大幅度降低网页链接查找和识别工作复杂度的 Python 库,它可以 让你轻松地采集一个或多个域名的信息。
Scrapy 1.3.0 已经支持 python3.3+了
官方文档 : Scrapy 1.3 documentation
安装: pip3 install scrapy
Scrapy 创建项目
1 | scrapy startproject wikiSpider |
执行上面命令后:会生成目录:
1 | - wikiSpider |
Scrapy 创建爬虫
1. 在items.py中添加一个类
1 | class Article(scrapy.Item): |
Scrapy 的每个 Item(条目)对象表示网站上的一个页面。当然,你可以根据需要定义不同的条目(比如url、content、header image等),但是现在我只演示收集每页的title字段 (field)。
2. wikiSpider/wikiSpider/spiders/ 文件夹里增加一个 articleSpider.py 文件
1 | from scrapy.selector import Selector |
通过运行 scrapy crawl article
可以看到一大堆日志信息 和:
1 | Title is: Main Page |
解析JSON
1 | import json |
储存数据
使用
urlretrieve
储存到本地
1 | import os |
选择首页上所有带 src 属性的标签。然 后对 URL 链接进行清理和标准化,获得文件的绝对路径(而且去掉了外链)。最后,每个文件都会下载到程序所在文件夹的 downloaded 文件里。
将网页中的表单保存为CSV格式
1 | import csv |
高级数据采集
POST 与 登录
使用第三方库 Request
安装pip3 install requests
使用:1
2
3
4import requests
params = {'firstname': 'Ryan', 'lastname': 'Mitchell'}
r = requests.post("http://pythonscraping.com/files/processing.php", data=params)
print(r.text)
处理Cookie
使用 requests库跟踪cookie
1 | import requests |
处理Session
使用 requests库跟踪session
1 | import requests |
修改header
为了让请求更像是浏览器发出的,需要修改请求头
1 | import requests |