第一部分-创建爬虫

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. 数据库的读写分离(Amoeba)

    目录 Amoeba Amoeba读写分离的配置 Amoeba Amoeba(变形虫) 项目,该开源框架于2008年开始发布一款 Amoeba for Mysql软件. 这个软件基于Java致力于MyS ...

  2. Windows本地安全策略

    目录 本地安全策略 密码策略 账户策略 审核策略 用户权限分配 安全选项 本地安全策略 安全策略是影响计算机安全性的安全设置的组合.可以利用本地安全策略来编辑本地计算机上的帐户 系统安全策略包括下面的 ...

  3. seccomp沙盒逃逸基础——沙盒的规则编写

    seccomp沙盒逃逸基础--沙盒的规则编写 引入: 安全计算模式 seccomp(Secure Computing Mode)是自 Linux 2.6.10 之后引入到 kernel 的特性.一切都 ...

  4. jupyter中那些神奇的第三方拓展魔术命令

    1 简介 无论是jupyter notebook还是jupyter lab,都可以使用ipython中的众多自带魔术命令来实现丰富的辅助功能,诸如%time之类的. 这些都已经是老生常谈的知识没什么好 ...

  5. 浅谈自动特征构造工具Featuretools

    简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python的特征工程库featuretools可以帮助我们简化这一过程.Featuretools是执行自动化特征工 ...

  6. Java版的扫雷游戏源码

    package com.xz.sl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; i ...

  7. MySQL5.7升级到8.0过程详解

    前言: 不知不觉,MySQL8.0已经发布好多个GA小版本了.目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了.本篇文章主要介绍从 ...

  8. printf/scanf格式

    (1)打印字符 char c; printf("%c",c); (2)打印整形 int i; printf("%d",i); //有符号十进制数 printf( ...

  9. OOP第二章博客

    OO第二次博客作业 (1)作业分析 三次作业在处理多线程的协同配合时都是使用将同步放在自己写的"线程安全类"(经测试有些许漏洞_,但是不影响结果就是了): 我个人倾向于把wait( ...

  10. 前端面试 CSS三大特性

    CSS的三大特性 1.层叠性 代码由上向下执行,相同选择器设置到同一元素上,样式冲突的,会执行比较靠近html的样式,样式不冲突的情况下不影响 代码如下 <!DOCTYPE html> & ...