《python网络数据采集》笔记1
第一部分-创建爬虫
1.urllib
1)urllib.request
request.urlopen(url)
request.urlretrieve 可以根据文件的 URL 下载文件
2)urllib.parse
3)urllib.error
2.异常:
try...except...else...
常见异常:HTTPError,AttributeError,
3.BeautifulSoup
from bs4 import BeautifulSoup
bsObj=BeautifulSoup(html,'lxml')
1)
print(bsObj.text)
print(bsObj.html)
print(bsObj.p.a)
...
2)
findAll(tag, attributes, recursive, text, limit, keywords) #返回一个ResultSet
find(tag, attributes, recursive, text, keywords) #返回一个Tag
借助它们,你可以通过标签的不同属性轻松地过滤 HTML 页面,查找需要的标签组或单个标签
例:
.findAll({"h1","h2","h3","h4","h5","h6"})
.findAll("span", {"class":{"green", "red"}})
.findAll(id="text") 同 .findAll("", {"id":"text"})
.findAll(src=True) 有src属性的标签
3)
get_text() 会把你正在处理的 HTML 文档中所有的标签都清除,然后返回一个只包含文字的str
4)返回类型NavigatorString
.children (所有子标签)
.next_sibling( 下一个兄弟标签 ).next_siblings(所有之后的兄弟标签)
.previous_sibling(上一个兄弟标签).previous(所有之前的兄弟标签)
.parent (直接父标签 ).parents(所有父标签)、
5)
.attrs 获取标签所有属性(dict)
.attrs['src'] 获取src值
6)正则表达式
7)lambda表达式
#获取有两个属性的标签:
bsObj.findAll(lambda tag: len(tag.attrs) == 2)
4.Scrapy
//TODO
5.JSON
把 JSON 转换成字典,
JSON 数组转换成列表,
JSON 字符串转换成 Python 字符串。
常用函数:loads,get
6.存储数据
1)下载
from urllib.request import urlretrieve
urlretrieve(resourceLocation,fileName)
2)CSV(Comma-Separated Values)
import csv
csvFile=open("test.csv","w+")
try:
writer=csv.writer(csvFile)
writer.writerow(('青山隐隐水迢迢 秋尽江南草未凋','24桥明月夜'))
for i in range(1,5):
writer.writerow((i,i+2,i*2))
finally:
csvFile.close()
3)MySQL
import pymysql
#获取连接 获取光标
conn=pymysql.connect(host='localhost',user='root',passwd=None)
cur=conn.cursor()
#执行SQL语句
cur.execute('use ssm01')
cur.execute('select * from user')
print(cur.fetchone())#获取一条数据
#关闭资源
cur.close()
coon.close()
4)Email
//TODO
7.读取文档
1)读取txt
from urllib.request import urlopen
txt=urlopen('http://www.pythonscraping.com/pages/warandpeace/chapter1.txt')
print(txt.read())
2)读取csv
#从网上直接把文件读成一个字符串,然后转换成一个 StringIO 对象,使它具有文件的属性。
from urllib.request import urlopen
from io import StringIO
import csv
data = urlopen('http://pythonscraping.com/files/MontyPythonAlbums.csv').read().decode('utf-8')
dataFile=StringIO(data)
csvFile=csv.reader(dataFile)
for row in csvFile:
print(row)
3)读取PDF
#PDFMiner3K
#把任意 PDF 读成字符串,然后用 StringIO 转换成文件对象
from urllib.request import urlopen
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from io import StringIO
def readPDF(pdfFile):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdfFile)
device.close()
content = retstr.getvalue()
retstr.close()
return content
pdfFile = urlopen("http://pythonscraping.com/pages/warandpeace/chapter1.pdf")
outputString = readPDF(pdfFile)
print(outputString)
pdfFile.close()
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
例
3-1.网络数据采集
#从 http://oreilly.com 开始,然后随机地从一个外链跳到另一个外链。
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import datetime
import random
pages = set()
random.seed(datetime.datetime.now())
# 获取页面所有内链的列表
def getInternalLinks(bsObj, includeUrl):
internalLinks = []
# 找出所有以"/"开头的链接
for link in bsObj.findAll("a", href=re.compile("^(/|.*"+includeUrl+")")):
if link.attrs['href'] is not None:
if link.attrs['href'] not in internalLinks:
internalLinks.append(link.attrs['href'])
return internalLinks
# 获取页面所有外链的列表
def getExternalLinks(bsObj, excludeUrl):
externalLinks = []
# 找出所有以"http"或"www"开头且不包含当前URL的链接
for link in bsObj.findAll("a",href=re.compile("^(http|www)((?!"+excludeUrl+").)*$")):
if link.attrs['href'] is not None:
if link.attrs['href'] not in externalLinks:
externalLinks.append(link.attrs['href'])
return externalLinks
def splitAddress(address):
addressParts = address.replace("http://", "").split("/")
return addressParts
def getRandomExternalLink(startingPage):
html = urlopen(startingPage)
bsObj = BeautifulSoup(html,'lxml')
externalLinks = getExternalLinks(bsObj, splitAddress(startingPage)[0])
if len(externalLinks) == 0:
internalLinks = getInternalLinks(startingPage)
return getNextExternalLink(internalLinks[random.randint(0,len(internalLinks)-1)])
else:
return externalLinks[random.randint(0, len(externalLinks)-1)]
def followExternalOnly(startingSite):
externalLink = getRandomExternalLink("http://oreilly.com")
print("随机外链是:"+externalLink)
followExternalOnly(externalLink)
followExternalOnly("http://oreilly.com")
5-1.JSON
import json
jsonString='{\
"arrayOfNums":[{"number":0},{"number":1},{"number":2}],\
"arrayOfFruits":[{"fruit":"apple"},{"fruit":"banana"},{"fruit":"pear"}]\
}'
jsonObj=json.loads(jsonString)
print(jsonObj.get("arrayOfFruits")[2].get("fruit"))
6-1.把 http://pythonscraping.com 的所有图片下载下来
from urllib.request import urlretrieve
from urllib.request import urlopen
from bs4 import BeautifulSoup
def pageSrc(url):
html=urlopen(url)
bsObj=BeautifulSoup(html,'lxml')
srcList=bsObj.findAll("img",src=True)
urlList=[]
for i in srcList:
urlList.append(i['src'])
return urlList
def getInternalLinks(bsObj,includeUrl):
internalLinks = []
# 找出所有以"/"开头的链接
for link in bsObj.findAll("a", href=re.compile("^(/|.*"+includeUrl+")")):
if link.attrs['href'] is not None:
if link.attrs['href'] not in internalLinks:
internalLinks.append(link.attrs['href'])
return internalLinks
def allimgs(url):
#找到该页面所有的img src
srcset=set()
for i in pageSrc(url):
if i not in srcset:
print(i)
srcset.add(i)
name=i.split('/').pop()
urlretrieve(i,name)
#找到该页面的所有内链
html=urlopen(url)
bsObj=BeautifulSoup(html,'lxml')
for i in getInternalLinks(bsObj,url):
newUrl=url+i
for j in pageSrc(newUrl):
if j not in srcset:
srcset.add(i)
print(j)
name=j.split('/').pop()
urlretrieve(j,name)
url="http://pythonscraping.com"
allimgs(url)
6-2.存储到CSV
#获取 HTML 表格并写入 CSV 文件
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://en.wikipedia.org/wiki/Comparison_of_text_editors")
bsObj = BeautifulSoup(html,'lxml')
# 主对比表格是当前页面上的第一个表格
table = bsObj.findAll("table",{"class":"wikitable"})[0]
rows = table.findAll("tr")
csvFile = open("editors.csv", 'wt', newline='',encoding='utf-8')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow = []
for cell in row.findAll(['td', 'th']):
csvRow.append(cell.get_text()[:-1])
print(csvRow)
writer.writerow(csvRow)
finally:
csvFile.close()
6-3.存储到mysql
#存储维基百科数据
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import datetime
import random
import pymysql
conn = pymysql.connect(host='127.0.0.1',user='root', passwd=None, charset='utf8')
cur = conn.cursor()
cur.execute("USE ssm01")
cur.execute("CREATE TABLE pages(title varchar(200),content varchar(3000))")
random.seed(datetime.datetime.now())
#存储到数据库
def store(title, content):
cur.execute("INSERT INTO pages (title, content) VALUES (\"%s\",\"%s\")", (title, content))
cur.connection.commit()
#找到数据 存储到数据库
def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html,'lxml')
title = bsObj.find("h1").get_text()
content = bsObj.find("div", {"id":"mw-content-text"}).find("p").get_text()
store(title, content)
return bsObj.find("div", {"id":"bodyContent"}).findAll("a",href=re.compile("^(/wiki/)((?!:).)*$"))
links = getLinks("/wiki/Kevin_Bacon")
try:
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
print(newArticle)
links = getLinks(newArticle)
finally:
cur.close()
conn.close()
《python网络数据采集》笔记1的更多相关文章
- Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一
Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...
- 深入理解java虚拟机笔记Chapter12
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...
- 深入理解Java虚拟机笔记
1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...
- 深入理解java虚拟机笔记Chapter7
虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 J ...
- 深入理解java虚拟机笔记之一
Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...
- 深入理解Java虚拟机笔记——虚拟机类加载机制
目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...
- 【转载】深入理解Java虚拟机笔记---运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...
- 深入理解java虚拟机笔记Chapter8
运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...
- 深入理解java虚拟机笔记Chapter2
java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...
- 类文件结构——深入理解Java虚拟机 笔记三
在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...
随机推荐
- 基于ray的分布式机器学习(二)
基本思路:基于parameter server + multiple workers模式.同步方式:parameter server负责网络参数的统一管理,每次迭代均将参数发送给每一个worker,多 ...
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...
- 改善c++程序的150个建议(读后总结)-------19-26
19. 明白在c++中如何使用c c++可以兼容c的绝大部分代码,但是还是有一部分不能兼容. c语言的编译器在调用函数时会把函数翻译成 : "_函数名",例如: int nasa( ...
- 《Spring 手撸专栏》第 2 章:小试牛刀(让新手能懂),实现一个简单的Bean容器
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 上学时,老师总说:不会你就问,但多数时候都不知道要问什么! 你总会在小傅哥的文章前言 ...
- OOP第三章博客
OO第三单元博客 • (1)梳理JML语言的理论基础.应用工具链情况: 理论基础: 网络资料上面介绍JML有两种主要的用法: 开展规格化设计.这样交给代码实现人员的将不是可能带有内在模糊性.二义性的自 ...
- OO_Unit4_UML模型化设计
CSDN博客传送门 @ 目录 一.架构设计 (一)第一次作业 作业需求分析 建立类图 bug修复 (二)第二次作业 作业需求分析 建立类图 checkForUml002实现方式 checkForUml ...
- 消息队列RabbitMQ(二):RabbitMQ的系统架构概述
前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...
- Zoho Projects助力企业项目高效管理
挑选项目管理工具,就和人买衣服.买鞋子是一样的,除了看外观,最重要的是合适.随着项目管理工具的不断发展,市面上有很多工具都非常优秀,也能解决企业.团队的实际需求. 对于项目管理来说,最重要的在于人员协 ...
- [刷题] 1022 D进制的A+B (20分)
思路 设t = A + B,将每一次t % d的结果保存在int类型的数组s中 然后将t / d,直到 t 等于 0为止 此时s中保存的就是 t 在 D 进制下每一位的结果的倒序 最后倒序输出s数组 ...
- [刷题] 167 Two Sum II
要求 升序数组 找到两个数使得它们相加之和等于目标数 函数返回两个下标值(下标从1开始) 示例 输入:numbers = [2, 7, 11, 15], target = 9 输出:[1,2] 思路 ...