第一部分-创建爬虫

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的更多相关文章

  1. Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一

    Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...

  2. 深入理解java虚拟机笔记Chapter12

    (本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...

  3. 深入理解Java虚拟机笔记

    1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...

  4. 深入理解java虚拟机笔记Chapter7

    虚拟机类的加载机制 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类的加载机制. 类加载的时机 J ...

  5. 深入理解java虚拟机笔记之一

    Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...

  6. 深入理解Java虚拟机笔记——虚拟机类加载机制

    目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...

  7. 【转载】深入理解Java虚拟机笔记---运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  8. 深入理解java虚拟机笔记Chapter8

    运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...

  9. 深入理解java虚拟机笔记Chapter2

    java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...

  10. 类文件结构——深入理解Java虚拟机 笔记三

    在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...

随机推荐

  1. VPS、云主机 and 服务器集群、云计算 的区别

    VPS:(virtual private server)虚拟专用服务器,将一台服务器分割成多个虚拟专享服务器的优质服务.实现VPS的技术分为容器技术和虚拟化技术.在容器或虚拟机中,每个VPS都可分配独 ...

  2. DVWA之DOM XSS(DOM型跨站脚本攻击)

    目录 Low Medium High Impossible Low 源代码: <?php # No protections, anything goes ?> 从源代码可以看出,这里low ...

  3. POJ1094查分约束,判断关系是否唯一

    题意:       给你一些a<b的关系,然后有三组询问. 1 当前这组之后如果能确定这n个数的大小关系,那么就输出关系 2 当前时候出现bug,就是和前面如果冲突,那么就不行 3 最后的答案是 ...

  4. Linux-鸟菜-2-主机规划与磁盘分区

    Linux-鸟菜-2-主机规划与磁盘分区 开机流程: 1. BIOS:開機主動執行的韌體,會認識第一個可開機的裝置: 2. MBR:第一個可開機裝置的第一個磁區內的主要開機記錄區塊,內含開機管理程式: ...

  5. JetBrains系列软件用法

    IDEA JSON格式化 IDEA的JSON_Formatter插件,下载地址 安装方式:File->Settings->Plugins,然后选择INstall plugin from d ...

  6. Andrew Ng机器学习算法入门(三):线性回归算法

    线性回归 线性回归,就是能够用一个直线较为精确地描述数据之间的关系.这样当出现新的数据的时候,就能够预测出一个简单的值. 线性回归中最常见的就是房价的问题.一直存在很多房屋面积和房价的数据,如下图所示 ...

  7. Web中的相对路径和绝对路径

    前台路径:浏览器端发起的资源请求路径 后台路径:服务器端发起的资源请求路径

  8. Java线程的6种状态

    6种状态分别是: NEW.RUNNABLE.TERMINATED.WAITING.TIMED_WAITING.BLOCKED NEW:线程创建完毕 RUNNABLE:线程运行中,又分为READY + ...

  9. Java并发工具篇

    theme: juejin highlight: an-old-hope 作者:汤圆 个人博客:javalover.cc 前言 随着天气的逐渐变热,整个人也开始浮躁不安 当然这里说的不是我,因为我是一 ...

  10. SimpleDateFormat线程不安全的5种解决方案!

    1.什么是线程不安全? 线程不安全也叫非线程安全,是指多线程执行中,程序的执行结果和预期的结果不符的情况就叫做线程不安全. ​ 线程不安全的代码 SimpleDateFormat 就是一个典型的线程不 ...