(一)爬虫基础
####### 慕课数据采集学习视频
爬虫基本原理:
1.挑选种子URL;
2.将这些URL放入待抓取的URL队列;
3.取出待抓取的URL,下载并存储进已下载网页库中。此外,将这些URL放入待抓取URL队列,进入下一循环;
4.分析已抓取队列中的URL,并且将URL放入待抓取URL队列,从而进入下一循环。
(一)爬虫的基本思路:
如图所示:
- 使用urllib,urllib2,requests库爬取Html网页
- 解析Html网页的内容(re、Xpath、BeautifulSoup4、jsonpath、pyquery等)
- 将解析后的数据保存文本文件或数据库
- 数据分析、图表展示数据
(二)数据采集范围:
- 采集单个域名
- 采集整个网站
- 采集整个互联网
(三)urllib库中的urlopen()函数的使用
urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
1.参数 url 表示远程数据的路径,一般是 http 或者 ftp 路径
from urllib.request import urlopen
response=urlopen("http://www.baidu.com/")
print(response.read().decode("utf-8"))
2.参数 data 表示以 get 或者 post 方式提交到 url 的数据
from urllib.request import urlopen
from urllib.parse import urlencode
data=bytes(urlencode({'word':'hello'}),encoding='utf-8')
response=urlopen("http://httpbin.org/post",data=data)
print(response.read().decode('utf-8'))
3.timeout超时处理(规定时间内没有响应,报超时错误!)
from urllib.request import urlopen
from urllib.error import URLError
import socket
try:
response=urlopen("http://www.baidu.com",timeout=0.01)
except URLError as e:
if isinstance(e.reason,socket.timeout):
print("超时!")
(四)响应类型、状态码、响应头
from urllib.request import urlopen
response=urlopen("http://www.baidu.com/")
print(type(response))
print(response.status)
print(response.getheaders())
print(response.getheader("Server"))
输出结果:
<class 'http.client.HTTPResponse'>
200
[('Date', 'Wed, 28 Feb 2018 05:37:57 GMT'), ('Content-Type', 'text/html; charset=utf-8')
, ('Transfer-Encoding', 'chunked'), ('Connection', 'Close'), ('Vary', 'Accept-Encoding'),
('Set-Cookie', 'BAIDUID=F7360D3AA15D1761920CAF718A101283:FG=1; expires=Thu,
31-Dec-37 23:55:55 GMT; max-age=2147483647;
path=/; domain=.baidu.com'),
('Set-Cookie', 'BIDUPSID=F7360D3AA15D1761920CAF718A101283;
expires=Thu,
31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/;
domain=.baidu.com'), ('Set-Cookie', 'PSTM=1519796277;
path=/; domain=.baidu.com'), ('Set-Cookie', 'BDSVRTM=0;
('Set-Cookie', 'H_PS_PSSID=1442_25548_21110_17001_20929;
path=/; domain=.baidu.com'),
('Cache-Control', 'private'), ('Cxy_all', 'baidu+fb72548cc1c9d0ea9b57192ae540eaf1'),
('Expires', 'Wed, 28 Feb 2018 05:37:50 GMT'),
('X-Powered-By', 'HPHP'), ('Server', 'BWS/1.1'),
('X-UA-Compatible', 'IE=Edge,chrome=1'),
('BDPAGETYPE', '1'), ('BDQID', '0x84fc56a30001f98b')
, ('BDUSERID', '0')]
BWS/1.1
(五)Request类的使用
1.处理复杂的url请求使用Request类
2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3.#key:代表User-Agent value:指User-Agent的内容
request.add_header(key,value)
(二)urllib库的使用
1.urllib库的作用
- urllib是Python3.x中提供一系列操作URL的库,它可以轻松的模拟
用户使用浏览器访问网页。 - 获取html网页
2.使用urllib发送GET请求
#1.导入urllib库中的request模块
from urllib import request
#2.请求URL
response=request.urlopen('http://www.baidu.com')
#3.使用响应对像输出数据
print(response.read().decode('utf-8'))
3.模拟真实浏览器
from urllib import request
url='http://www.baidu.com'
request=request.Request(url)
#key:代表User-Agent value:指User-Agent的内容
request.add_header(key,value)
response=request.urlopen(request)
print(response.read().decode("utf-8"))
4.使用urllib发送post请求
#导入urllib库下 面的parse
from urllib import parse
#使用urlencode生成post数据
postData=parse.urlencode([
(key1,val1),
(key2,val2),
(keyn,valn),
])
#使用postData发送post请求
request.urlopen(request,data=postData.encode("utf-8"))
#得到请求状态
response.status
#得到服务器的类型
response.reason
实例演示(查看Google浏览器源码快捷键:Fn+F12)
from urllib.request import urlopen
from urllib.request import Request
from urllib import parse
#1.创建request对象
request=Request("http://www.thsrc.com.tw/tw/TimeTable/SearchResult")
#2.浏览器post请求将数据编码后再发送请求
postData=parse.urlencode([
("StartStation","977abb69-413a-4ccf-a109-0272c24fd490"),
("EndStation","3301e395-46b8-47aa-aa37-139e15708779"),
("SearchDate","2018/02/27"),
("SearchTime","12:30"),
("SearchWay","DepartureInMandarin")
])
#3添加头部信息
request.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"
" (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
request.add_header("Origin","http://www.thsrc.com.tw")
#4.打开链接
response=urlopen(request,data=postData.encode("utf-8"))
#5.解码
print(response.read().decode("utf-8"))
5.爬取贴吧主页的图片链接,并添加到MySQL数据库
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import pymysql.cursors
url="https://tieba.baidu.com/index.html"
response=urlopen(url)
#1.读取html页面
html=response.read().decode('utf-8')
# print(html)
#2.解析html页面
soup=BeautifulSoup(html,'html.parser')
#3.获取目标标签
links=soup.findAll('img',{"src":re.findall('http.*?jpg',html)})
for link in links:
print(link['src'])
#4.连接数据库
conn = pymysql.connect(user='root', password='root', db='pythontest', port=3306,
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
cur=conn.cursor()
insert_sql="insert into url_table(url) values(%s)"
try:
#5.执行sql语句
cur.execute(insert_sql,(link['src']))
print("URL成功插入数据库")
conn.commit()
except:
conn.rollback()
finally:
conn.close()
结果演示