Python爬虫基础urllib的使用

(一)爬虫基础

####### 慕课数据采集学习视频

爬虫基本原理:

1.挑选种子URL;
2.将这些URL放入待抓取的URL队列;
3.取出待抓取的URL,下载并存储进已下载网页库中。此外,将这些URL放入待抓取URL队列,进入下一循环;
4.分析已抓取队列中的URL,并且将URL放入待抓取URL队列,从而进入下一循环。
这里写图片描述
(一)爬虫的基本思路:

如图所示:
这里写图片描述

  1. 使用urllib,urllib2,requests库爬取Html网页
  2. 解析Html网页的内容(re、Xpath、BeautifulSoup4、jsonpath、pyquery等)
  3. 将解析后的数据保存文本文件或数据库
  4. 数据分析、图表展示数据

(二)数据采集范围:

  1. 采集单个域名
  2. 采集整个网站
  3. 采集整个互联网

(三)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()

结果演示
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值