Python网络爬虫(由简入深)
本文章包含内容
一、Python必备基础认识
二、Python编写的初步尝试(用Sublime Text编写)
三、网络爬虫-使用Python和urllib、Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中
四、结束语
附
【附1:解决Sublime Text对Python的支持】
【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
【附3:使用Beautiful Soup库来标准输出网页内容】
【附4:正则表达式必备基础知识】
【附5:Sublime Text的控制台输入】
一、Python必备基础认识
-
查看Python版本
python --version
或python -V
(大小的V) -
打开查看Mac系统自带Python2:
open /System/Library/Frameworks/Python.framework/Versions
-
打开查看自己安装的Python3:
open /usr/local/Frameworks/Python.framework/Versions
-
查看编译命令所在的位置
which python3
-
在cmd命令行里进入和退出Python程序
- 进入:
进入系统Python2:直接输入python
即可;
进入自装Python3:直接输入python3
即可;- 退出:
方法①:输入exit()
,回车
方法②:输入quit()
,回车
方法③:输入ctrl+z,回车
二、Python编写的初步尝试(用Sublime Text编写)
- 语法注意
python2.x | python3.x | |
---|---|---|
打印 | print "Hello world" | print ("Hello world") |
引入模块 | import urllib2 | import urllib.request |
import sys reload(sys) sys.setdefaultencoding('utf8') |
import importlib,sys importlib.reload(sys) |
|
输入 | raw_input | input |
- 导入模块
设A为模块名,B为模块A中的某个类、方法或者变量等
import A | from A import B | |
---|---|---|
含义 | 导入整个模块A | 导入A中的B |
调用A中的B | A.B | B |
- 测试Sublime Text对Python编写的支持
测试Sublime Text对Python编写的支持.png
另有【附1:解决Sublime Text对Python的支持】
三、网络爬虫-使用Python和urllib、Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中
本节包含内容如下:
1、抓取数据的必备知识(获取及打印网页内容)
2、使用BeautifulSoup库的必备知识
3、使用Beautiful Soup库抓取网页数据,并输入想要的内容至plist文件中示例
1、抓取数据的必备知识(获取及打印网页内容)
以要抓取某个网站上的东西为例,
#-*- coding:utf-8 -*-
import urllib.request
resp=urllib.request.urlopen('http://www.baidu.com')
html=resp.read()
print(html)
一般为了能够让输出内容更加刻度,我们都会按照【附3:使用Beautiful Soup库来标准输出网页内容】
进行操作。
要使用Beautiful Soup库,请参照【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
进行安装。
2、使用BeautifulSoup库的必备知识
- ①、不能创建bs4.py的文件,会造成与系统冲突,同时在
from bs4 import BeautifulSoup
代码处报错 - ②、
soup = BeautifulSoup(html, 'html.parser')
不要漏写解析器,要不然会有No parser was explicitly specified, so I'm using the best available HTML par
警告 - ③、更多问题可查看Beautiful Soup 4.4.0 官网文档
3、使用Beautiful Soup库抓取网页数据,并输出想要的内容至plist文件中示例
#-*- coding:utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
import importlib,sys
importlib.reload(sys)
# 函数
def printPlistCode():
#1.得到这个网页的 html 代码 #
html = urllib.request.urlopen("http://movie.douban.com/chart").read()
#2.转换 一种格式,方便查找
#soup = BeautifulSoup(html, 'html.parser')
soup = BeautifulSoup(html,'lxml')
print(soup.prettify())
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p)
print(soup.p["class"])
print(soup.a)
print(soup.find_all('a'))
print(soup.find(id='link3'))
print("\n")
print("\n")
print("\n")
#3. 得到 找到的所有 包含 a 属性是class = nbg 的代码块,数组
liResutl = soup.findAll('a', attrs = {"class" : "nbg"})
#4.用于拼接每个字典的字符串
tmpDictM = ''
#5. 遍历这个代码块 数组
for li in liResutl:
#5.1 找到 img 标签的代码块 数组
imageEntityArray = li.findAll('img')
#5.2 得到每个image 标签
for image in imageEntityArray:
#5.3 得到src 这个属性的 value 后面也一样 类似 key value
link = image.get('src')
imageName = image.get('alt')
#拼接 由于 py中 {} 是一种数据处理格式,类似占位符
tmpDict = '''@{0}@\"name\" : @\"{1}\", @\"imageUrl\" : @\"{2}\"{3},'''
tmpDict = tmpDict.format('{',imageName,link,'}')
tmpDictM = tmpDictM + tmpDict
#6.去掉最后一个 ,
tmpDictM = tmpDictM[0:len(tmpDictM) - 1] #为了能输出原生中文不要进行.encode('utf8')
#7 拼接全部
restultStr = '@[{0}];'.format(tmpDictM)
print(restultStr)
if __name__ == '__main__':
printPlistCode()
输出结果为
抓取到的内容.png
下面将其拷贝出来至Xcode,并写入plist文件中
将抓取的内容写入plist文件的代码.png
查看输出到该路径下的文件内容,如图所示:
整理到plist文件中的内容.png
至此,恭喜您已经完成抓取网页数据,并输入想要的内容至plist文件中。
分割图1.jpg
四、初探Python的requests模块
import requests
response=requests.get('https://api.github.com/events')
print(response.text)
其他各种请求方式:常用的就是requests.get()和requests.post()
import requests
response1 = requests.get('https://api.github.com/events')
response2 = requests.post('http://httpbin.org/post', data = {'key':'value'})
response3 = requests.put('http://httpbin.org/put', data = {'key':'value'})
response4 = requests.delete('http://httpbin.org/delete')
response5 = requests.head('http://httpbin.org/get')
response6 = requests.options('http://httpbin.org/get')
五、结束语
感谢您的细心查阅,如有不足,还请指教。
附
【附1:解决Sublime Text对Python的支持】
【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
【附3:使用Beautiful Soup库来标准输出网页内容】
【附4:正则表达式必备基础知识】
【附5:Sublime Text的控制台输入】
【附1:解决Sublime Text对Python的支持】
Sublime的.sublime-build文件的位置:~/Library/Application Support/Sublime Text 3/Packages/User
- 解决Sublime Text对Python的支持
解决Sublime Text对Python的支持.png
【附2:使用python的pip安装开发包/库(示例添加Beautiful Soup库)】
Mac上装python的pip安装包时,显示-bash: pip: command not found的解决办法
命令①、curl 'https://bootstrap.pypa.io/get-pip.py' > get-pip.py
命令②、sudo python get-pip.py
使用python的pip安装Beautiful Soup库.png
【附3:使用Beautiful Soup库来标准输出网页内容】
执行如下代码即可
import urllib.request
from bs4 import BeautifulSoup
html = urllib.request.urlopen("http://movie.douban.com/chart").read()
soup = BeautifulSoup(html,'lxml')
print(soup.prettify())
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p)
print(soup.p["class"])
print(soup.a)
print(soup.find_all('a'))
print(soup.find(id='link3'))
【附4:正则表达式必备基础知识】
常用正则表达式语法
特殊字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。(必须跟在*或者+后边用) |
. | 匹配除换行符 \n 之外的任何单字符 |
因为.
相当于除换行符 \n 之外的任何单字符
- 二符(贪婪匹配,即匹配尽可能多的字符。因为已经尽可能多了,所以结果至多只有一个。):
以ab为例 | 以aabaabab为例 | ||
---|---|---|---|
.* | 尽可能多,哪怕匹配结果是零次除换行符 \n 之外的任何单字符 的也算匹配成功。 |
||
.+ | 尽可能多,只要匹配结果是没达到至少一次除换行符 \n 之外的任何单字符 ,就算没匹配成功 |
||
a.*b | 它将匹配最长 的以a开始,以b结束的字符串。 |
它将会匹配到整个字符串ab | 它将会匹配到整个字符串aabab |
a.+b | 它将匹配最长 的以a开始,以b结束,且开头和结束之间是不能没有其他字符的字符串。 |
它将没有匹配 | 它将会匹配到整个字符串aabab |
- 三符(懒惰匹配,即匹配尽可能少的字符。因为已经尽可能少了,所以结果一般都有多个。所以如果成功匹配到一个后,其会继续寻找下一个,直至结束):
以ab为例 | 以aabaabab为例,会匹配到 | ||
---|---|---|---|
.*? | 尽可能少,哪怕匹配结果是零次除换行符 \n 之外的任何单字符 的也算匹配成功 |
我是来占位的。我是来占位的,我是来占位的。我是来占位的,我是来占位的 | |
.+? | 尽可能少,只要匹配结果是没达到至少一次除换行符 \n 之外的任何单字符 ,就算没匹配成功。 |
||
a.*?b | 它将匹配最短 的以a开始,以b结束的字符串 |
它将会匹配到整个字符串ab | aab(第一到第三个字符) aab(第四到第六个字符) ab(第七到第八个字符) |
a.+?b | 它将匹配最短 的以a开始,以b结束,且开头和结束之间是不能没有其他字符的字符串。 |
它将没有匹配 | aab(第一到第三个字符) aab(第四到第六个字符) |
实际可能举例及注意:
以"orderId":"aabaabab"为例 | 注意 | |
---|---|---|
".*?" | "orderId" "aabaabab" |
|
"(.*?)" | "orderId" "aabaabab" |
()是标记一个子表达式的开始和结束位置 |
"orderId":".*?" | "orderId":"aabaabab" | |
"orderId":"(.*?)" | "orderId":"aabaabab" | ()是标记一个子表达式的开始和结束位置。 |
"orderId":"\(.*?\)" | 没有匹配 |
\( 相当于检测括号 |
附:如果你想验证你的正则表达式是否正确的话,可以在在线正则表达式测试上验证。
举例:
正则表达式 | |
---|---|
a.b | 可以匹配这些字符串:acb、aeb、a b,但是不匹配aoob。 |
a.*?xxx | 可以匹配 abxxx axxxxx abbbbbxxx |
【附5:Sublime Text的控制台输入】
编译运行的时候为tools->build,即我们常用的快捷键Ctrl+B。这之后底下会出现控制台。但是这个在控制台中只能输出不能输入。
想要在Sublime Text的"控制台"实现输入,如有时候我们需要输入密码,则我们需要安装SublimeREPL插件。
安装SublimeREPL步骤:Ctrl+shift+p 键入 install packages,再继续键入 SublimeREPL 安装即可。
安装SublimeREPL完后,以后的编译运行的操作当你改为:tools->sublimeREPL->python->python-Run current file的时候,其就会出现新的页面REPL[python],作为新的控制台,可以输入输出互动。
如还不清楚,可查看sublime运行python程序的控制台输入