python3爬虫笔记

2019年6月5日11:48:17 发表评论 2,403 ℃

从web抓取信息

urllib模块 读取网页

>>>import urllib.requset

>>>page = urllib.request.urlopen('http://www.baidu.com')

>>>html = resp.read()

 

request.urlretrieve 根据文件的url下载文件

>>>from urllib.request import urlretrieve

>>>from urllib.request import urlopen

>>>from bs4 import BeautifulSoup

>>>html = urlopen("http://www.pythonscraping.com")

>>>bsObj = BeautifulSoup(html)

>>>imageLocation = bsObj.find("a", {"id": "logo"}).find("img")["src"]

>>>urlretrieve (imageLocation, "logo.jpg")

设置编码

>>>html = urlopen("http://en.wikipedia.org/wiki/Python_(programming_language)")

>>>bsObj = BeautifulSoup(html)

>>>content = bsObj.find("div", {"id":"mw-content-text"}).get_text()

>>>content = bytes(content, "UTF-8")

>>>content = content.decode("UTF-8")

 

 

html.parser模块提供了HTML分析库

 

webbrowser模块 在浏览器显示网页

>>>import webbrowser

>>>webbrowser.open('http://www.baidu.com') 浏览器打开百度

 

requests模块 从网页下载文件

pip install requests

requests.get() 下载一个网页

>>> import requests

>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')

>>> type(res)

<class 'requests.models.Response'>

>>> res.status_code == requests.codes.ok 返回状态码

True

>>> len(res.text)

178981

>>> print(res.text[:250])

 

raise_for_status() 检查是否下载成功 等同于 res.status_code == requests.codes.ok

>>> res = requests.get('http://inventwithpython.com/page_that_does_not_exist')

>>> res.raise_for_status()

 

iter_content()方法在循环的每次迭代中,返回一段内容。每一段都是 bytes 数据类型,你需要指定一段包含多少字节。

 

下载并保存到文件的完整过程如下:

1.调用 requests.get()下载该文件。

2.用'wb'调用 open(),以写二进制的方式打开一个新文件。

3.利用 Respose 对象的 iter_content()方法做循环。

4.在每次迭代中调用 write(),将内容写入该文件。

5.调用 close()关闭该文件。

>>> import requests

>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')

>>> res.raise_for_status()

>>> playFile = open('RomeoAndJuliet.txt', 'wb')

>>> for chunk in res.iter_content(100000):

playFile.write(chunk)

100000

78981

>>> playFile.close()

提交表单

>>> params = {'firstname': 'Ryan', 'lastname': 'Mitchell'}

>>> r = requests.post("http://pythonscraping.com/files/processing.php", data=params)

>>> print(r.text)

提交文件

>>> files = {'uploadFile': open('../files/Python-logo.png', 'rb')}

>>> r = requests.post("http://pythonscraping.com/pages/processing2.php",files=files)

>>> print(r.text)

处理cookie

>>> session = requests.Session()

>>> params = {'username': 'username', 'password': 'password'}

>>> s = session.post("http://pythonscraping.com/pages/cookies/welcome.php", params)

传递http请求头

>>> import requests

>>> from bs4 import BeautifulSoup

>>> session = requests.Session()

>>> headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)AppleWebKit 537.36 (KHTML, like Gecko) Chrome","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"}

>>> url = "https://www.whatismybrowser.com/developers/what-http-headers-is-my-browser-sending"

>>> req = session.get(url, headers=headers)

>>> bsObj = BeautifulSoup(req.text)

>>> print(bsObj.find("table",{"class":"table-striped"}).get_text)

 

beautifulSoup模块 解析HTML

pip install beautifulsoup4

从 HTML 创建一个 BeautifulSoup 对象

>>> import requests, bs4

>>> res = requests.get('http://nostarch.com')

>>> res.encoding='gb2312' #设置编码

>>> res.raise_for_status()

>>> noStarchSoup = bs4.BeautifulSoup(res.text) #bs4.BeautifulSoup(res.text,'html.parser') Windows脚本需要加html.parser参数

>>> type(noStarchSoup)

 

>>> exampleFile = open('example.html')

>>> soup = bs4.BeautifulSoup(exampleFile)

>>> type(soup)

>>> print(soup.prettify()) #打印Soup对象

>>> print(soup.title) #打印title标签

<title>i'm title</title>

>>> print(soup.title.name) #获取tag名称

title

>>> soup.title.name = 'mytitle' #修改tag名称

>>> print(soup.title)

None

>>> print(soup.mytitle)

<title>i'm title</title>

>>> print(soup.p['class'])

myclass

>>> print(soup.p.get'class'))

myclass

>>> print(soup.p.attrs)

{'class': 'myclass'}

>>> soup.p['class']="newclass" #修改class属性

>>>print(soup.p)

<p><b>The Dormouse's story</b></p>

>>> print(soup.title.string) #获取tag中的字符串

i'm title

>>> print(soup.title.contents) #将tag子节点以列表方式输出

["i'm title"]

 

.strings 属性主要应用于 tag 中包含多个字符串,可以进行循环遍历,示例如下:

for string in soup.strings:

print(repr(string))

.stripped_strings 属性可以去掉输出字符串中包含的空格或空行

 

.parent 属性来获取某个元素的父节点

>>> print(soup.h1.parent)

<div>

<h1>主页</h1>

</div>

 

.next_sibling 属性获取了该节点的下一个兄弟节点,

.previous_sibling 则与之相反,如果节点不存在,则返回 None。

 

.next_elements 前节点,不分层次

.previous_elements 后节点

 

select()方法寻找元素

soup.select('div') 所有名为<div>的元素

soup.select('#author') 带有 id 属性为 author 的元素

soup.select('.notice') 所有使用 CSS class 属性名为 notice 的元素

soup.select('div span') 所有在<div>元素之内的<span>元素

soup.select('div > span') 所有直接在<div>元素之内的<span>元素,中间没有其他元素

soup.select("#link1 ~ .sister") 查找 id="link1" 之后 的所有兄弟标签

soup.select("#link1 + .sister") 查找紧跟着 id="link1" 之后 的子标签

soup.select('input[name]') 所有名为<input>,并有一个 name 属性,其值无所谓的元素

soup.select('input[type="button"]') 所有名为<input>,并有一个 type 属性,其值为 button 的元素

 

>>> import bs4

>>> exampleFile = open('example.html')

>>> exampleSoup = bs4.BeautifulSoup(exampleFile.read())

>>> elems = exampleSoup.select('#author')

>>> type(elems)

<class 'list'>

>>> len(elems)

1

>>> type(elems[0])

<class 'bs4.element.Tag'>

>>> elems[0].getText() 返回匹配元素的文本

'Al Sweigart'

>>> str(elems[0]) 返回匹配元素的字符串,包含html标签

'<span id="author">Al Sweigart</span>'

>>> elems[0].attrs 返回一个字典

{'id': 'author'}

 

findAll()

findAll(tag, attributes, recursive, text, limit, keywords)

tag:标签

.findAll('h1')

.findAll(['h1','h2'])

传入True 匹配任何tag

attributes: 是用一个 Python 字典封装一个标签的若干属性和对应的属性值

.findAll("span", {"class":{"green", "red"}})

recursive: 设置为 True , findAll 就会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。默认为True

text:用标签的文本内容去匹配,而不是用标签的属性

.findAll(text=['python','php'])

.findAll('a',text='java')

limit:获取到匹配的前几项

.findAll('a',limit=2)

keywords:获取指定属性的标签

.findAll(id="text")

.get_text() 返回无标签文档

.attrs 获取标签属性

.attrs["src"]

 

find()

find(tag, attributes, recursive, text, keywords)

 

子标签和后代标签

例如: tr 标签是 tabel 标签的子标签,而 tr 、 th 、 td 、 img 和 span标签都是 tabel 标签的后代标签

.children() 获取子标签

find("table",{"id":"giftList"}).children

 

next_siblings()

获取兄弟标签,处理表格数据

bsObj.find("table",{"id":"giftList"}).tr.next_siblings:

previous_sibling()

和next_siblings功能类似,只返回单个标签

 

使用正则表达式

findAll("img",{"src":re.compile("\.\.\/img\/gifts/img.*\.jpg")})

find("div", {"id":"bodyContent"}).findAll("a",href=re.compile("^(/wiki/)((?!:).)*$"))

python3爬虫笔记

 

selenium模块 控制浏览器

pip install selenium

PhantomJS(后台运行浏览器,高版本selenium已经不支持) Firefox Chrome

Chrome无头

>>> from selenium import webdriver

>>> from selenium.webdriver.chrome.options import Options

>>> chrome_options = Options()

>>> chrome_options.add_argument('--headless')

>>> chrome_options.add_argument('--disable-gpu')

>>>chrome_options.add_argument('--no-sandbox')

>>>browser = webdriver.Chrome(chrome_options=chrome_options)

 

在centos7中安装chrome

安装最新版chrome

#yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm

#cat /etc/yum.repos.d/google-chrome.repo

[google-chrome]

name=google-chrome

baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64

enabled=1a

gpgcheck=1

gpgkey=https://dl.google.com/linux/linux_signing_key.pub

 

根据chrome版本下载对应的chromedriver

# google-chrome --version

https://npm.taobao.org/mirrors/chromedriver/

 

导入模块,

>>>from selenium import webdriver

>>>chrome = webdriver.Chrome() #先下载chromedriver 到Python安装目录https://sites.google.com/a/chromium.org/chromedriver/downloads

>>>chrome.get('http://www.baidu.com') #打开网址

>>>chrome.title #获取打开网址的名称

>>>chrome.current_url #获取打开网址的url

 

在页面中寻找元素

find_element_*() 返回一个 WebElement 对象,代表页面中匹配查询的第一个元素

find_elements_*() 返回 WebElement_*对象的列表,包含页面中所有匹配的元素。

 

selenium 的 WebDriver 方法,用于寻找元素

browser.find_element_by_class_name(name) 使用 CSS 类 name 的元素

browser.find_elements_by_class_name(name)

 

browser.find_element_by_css_selector(selector) 匹配 CSS selector 的元素

browser.find_elements_by_css_selector(selector)

 

browser.find_element_by_id(id) 匹配 id 属性值的元素

browser.find_elements_by_id(id)

 

browser.find_element_by_link_text(text) 完全匹配提供的 text 的<a>元素

browser.find_elements_by_link_text(text)

 

browser.find_element_by_partial_link_text(text) 包含提供的 text 的<a>元素

browser.find_elements_by_partial_link_text(text)

 

browser.find_element_by_name(name) 匹配 name 属性值的元素

browser.find_elements_by_name(name)

 

browser.find_element_by_tag_name(name) 匹配标签 name 的元素

browser.find_elements_by_tag_name(name) (大小写无关,<a>元素匹配'a'和'A')

 

WebElement 的属性和方法

tag_name 标签名,例如 'a'表示<a>元素

get_attribute(name) 该元素 name 属性的值

text 该元素内的文本,例如<span>hello</span>中的'hello'

clear() 对于文本字段或文本区域元素,清除其中输入的文本

is_displayed() 如果该元素可见,返回 True,否则返回 False

is_enabled() 对于输入元素,如果该元素启用,返回 True,否则返回 False

is_selected() 对于复选框或单选框元素,如果该元素被选中,选择 True,否则返回 False

location 一个字典,包含键'x'和'y',表示该元素在页面上的位置

page_source 返回页面源代码字符串

 

click() 模拟鼠标点击该元素

send_keys() 向文本框发送键盘击键

submit() 点击表单submit按钮

back() 点击“返回”按钮

forward() 点击“前进”按钮

refresh() 点击“刷新”按钮

quit() 点击“关闭窗口”按钮

 

发送特殊键

from selenium.webdriver.common.keys import Keys

 

Keys.DOWN, Keys.UP, Keys.LEFT,Keys.RIGHT 键盘箭头键

Keys.ENTER, Keys.RETURN 回车和换行键

Keys.HOME, Keys.END,Keys.PAGE_DOWN,Keys.PAGE_UP Home 键、End 键、PageUp 键和 Page Down 键

Keys.ESCAPE, Keys.BACK_SPACE,Keys.DELETE Esc、 Backspace 和字母键

Keys.F1, Keys.F2, . . . , Keys.F12 键盘顶部的 F 1 到 F 12 键

Keys.TAB Tab 键

 

如果光标当前不在文本字段中,按下 home 和 end 键,将使浏览器滚动到页面的顶部或底部。

>>> from selenium import webdriver

>>> from selenium.webdriver.common.keys import Keys

>>> browser = webdriver.Firefox()

>>> browser.get('http://nostarch.com')

>>> htmlElem = browser.find_element_by_tag_name('html')

>>> htmlElem.send_keys(Keys.END) # scrolls to bottom

>>> htmlElem.send_keys(Keys.HOME) # scrolls to top

获取cookie

>>>from selenium import webdriver

>>>driver = webdriver.PhantomJS(executable_path='<Path to Phantom JS>')

>>>driver.get("http://pythonscraping.com")

>>>driver.implicitly_wait(1)

>>>print(driver.get_cookies())

 

 

pymysql 模块

链接数据库

>>>conn=pymysql.connect(host='127.0.0.1',user='test',passwd='123456',db='testdb',charset='utf8')

>>> cur=conn.cursor()

>>> cur.execute('select version()')

>>> print(cur.fetchone())

('5.7.24-log',)

>>>sql = "insert into test(title) values ('%s')"% (title)

>>>cur.execute(sql)

>>>cur.connection.commit()

>>> cur.close()

>>> conn.close()

cursor() 创建光标对象

fetchone() 获取单条数据

fetchall() 获取全部返回数据

 

PySocks 模块

代理服务器通信模块

 

tesserocr 模块

识别验证码

>>>import tesserocr

>>>from PIL import Image

>>>image = Image.open('code.jpg')

>>>result = tesserocr.imgage_to_text(image)

>>>print(result)

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: