栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

爬虫之静态页面抓取

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

爬虫之静态页面抓取

静态网页抓取

在网络爬虫中,静态网页的数据比较容易获取,因为其所有数据都呈现在网页的HTML代码中

在静态网页抓取中,Python中的Requests库能够容易实现这个需求

通过requests发起Http请求
import requests
url="http://www.santostang.com/"
r=requests.get(url)
print("文本编码:",r.encoding)
print("响应状态码:",r.status_code)
print("响应文本内容:",r.text)
文本编码: UTF-8
响应状态码: 200
响应文本内容: 





Santos Tang












a{color:#1e73be}
a:hover{color:#2980b9!important}
#header{background-color:#1e73be}
.widget .widget-title::after{background-color:#1e73be}
.uptop{border-left-color:#1e73be}
#titleBar .toggle:before{background:#1e73be}






    
        
                                

《网络爬虫:从入门到实践》一书勘误

第四章 – 4.3 通过selenium 模拟浏览器抓取 07月15日 Python 网络爬虫 没有评论

4.3 通过selenium 模拟浏览器抓取 在上述的例子中,使用Chrome“检查”功能找到源地址还十分容易。但是有一些网站非常复杂,例如前面的天猫产品评论,使用“检查”功能很难找到调用的网页地址。除此之外,有一些数据...

第四章 – 4.2 解析真实地址抓取 07月14日 Python 网络爬虫 没有评论 ajax,python,网络爬虫,网页爬虫,解析地址

由于网易云跟帖停止服务,现在已经在此处中更新了新写的第四章。请参照文章: 4.2 解析真实地址抓取 虽然数据并没有出现在网页源代码中,我们也可以找到数据的真实地址,请求这个真实地址也可以获得想要的数据。...

第四章- 动态网页抓取 (解析真实地址 + selenium) 07月14日 Python 网络爬虫 没有评论 ajax,javascript,python,selenium,网络爬虫

由于网易云跟帖停止服务,现在已经在此处中更新了新写的第四章。请参照文章: 前面爬取的网页均为静态网页,这样的网页在浏览器中展示的内容都在HTML源代码中。但是,由于主流网站都使用Javascript展现网页内容,...

Hello world! 07月04日 Python 网络爬虫 1条评论

Welcome to WordPress. This is your first post. Edit or delete it, then start writing! 各位读者,由于网易云跟帖在本书出版后已经停止服务,书中的第四章已经无法使用。所以我将本书的评论系统换成了来必力...

文章分类
  • Python 网络爬虫 (5)

热门文章

随机推荐
  • Hello world!
  • 《网络爬虫:从入门到实践》一书勘误
  • 第四章 – 4.3 通过selenium 模拟浏览器抓取
  • 第四章- 动态网页抓取 (解析真实地址 + selenium)
  • 第四章 – 4.2 解析真实地址抓取

标签云 ajax javascript python selenium 网络爬虫 网页爬虫 解析地址

友情链接

2019 唐松-数据科学 版权所有

Powered by WordPress. Theme by JieStyle Two | 粤ICP备19068356号

代码在页面底部,统计标识不会显示,但不影响统计效果

使用说明
  • r.text:服务器响应的内容,会根据响应头部的字符编码进行解码
  • r.encoding:服务器内容使用的文本编码
  • r.status_code:响应状态码
    • 200:请求成功
    • 4xx:客户端错误
    • 5xx:服务器错误响应
  • r.content:字节方式的响应
  • r.json():Requests内置的JSON解码器
 
requests的用法 
1.URL参数 

有时我们为了请求特定的数据,需要直接在URL中加入一些数据,并且这些数据为在一个问号后面

如点击百度中的某条新闻,其链接为https://baijiahao.baidu.com/s?id=1719021671421019613&wfr=spider&for=pc,其URL中的?后面会跟着一些属性值

#示例,访问http://httpbin.org/get?key1=value1&&key2=value2
import requests
URL="http://httpbin.org/get"
key_dict={"key1":"value1","key2":"value2"}
r=requests.get(URL,params=key_dict)
print("已经编码的URL:",r.url)
print("响应文本内容:",r.text)
已经编码的URL: http://httpbin.org/get?key1=value1&key2=value2
响应文本内容: {
  "args": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "**", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-61b9cd28-16dce6c31b3e09c45cf7ef91"
  }, 
  "json": null, 
  "origin": "115.156.142.199", 
  "url": "http://httpbin.org/post"
}
4.超时处理

有时爬虫会遇到服务器长时间没有响应,这时候会造成爬虫程序一直等待

这是可以通过Requests中的timeout参数设置定时器,如果定时器触发后没有响应,就会返回异常

import requests
URL="http://www.santostang.com/"
r=requests.get(URL,timeout=0.001)
---------------------------------------------------------------------------

timeout                                   Traceback (most recent call last)

D:ProgramDataAnacondalibsite-packagesurllib3connection.py in _new_conn(self)
    168         try:
--> 169             conn = connection.create_connection(
    170                 (self._dns_host, self.port), self.timeout, **extra_kw


D:ProgramDataAnacondalibsite-packagesurllib3utilconnection.py in create_connection(address, timeout, source_address, socket_options)
     95     if err is not None:
---> 96         raise err
     97 


D:ProgramDataAnacondalibsite-packagesurllib3utilconnection.py in create_connection(address, timeout, source_address, socket_options)
     85                 sock.bind(source_address)
---> 86             sock.connect(sa)
     87             return sock


timeout: timed out


During handling of the above exception, another exception occurred:


ConnectTimeoutError                       Traceback (most recent call last)

D:ProgramDataAnacondalibsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    698             # Make the request on the httplib connection object.
--> 699             httplib_response = self._make_request(
    700                 conn,


D:ProgramDataAnacondalibsite-packagesurllib3connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
    393             else:
--> 394                 conn.request(method, url, **httplib_request_kw)
    395 


D:ProgramDataAnacondalibsite-packagesurllib3connection.py in request(self, method, url, body, headers)
    233             headers["User-Agent"] = _get_default_user_agent()
--> 234         super(HTTPConnection, self).request(method, url, body=body, headers=headers)
    235 


D:ProgramDataAnacondalibhttpclient.py in request(self, method, url, body, headers, encode_chunked)
   1254         """Send a complete request to the server."""
-> 1255         self._send_request(method, url, body, headers, encode_chunked)
   1256 


D:ProgramDataAnacondalibhttpclient.py in _send_request(self, method, url, body, headers, encode_chunked)
   1300             body = _encode(body, 'body')
-> 1301         self.endheaders(body, encode_chunked=encode_chunked)
   1302 


D:ProgramDataAnacondalibhttpclient.py in endheaders(self, message_body, encode_chunked)
   1249             raise CannotSendHeader()
-> 1250         self._send_output(message_body, encode_chunked=encode_chunked)
   1251 


D:ProgramDataAnacondalibhttpclient.py in _send_output(self, message_body, encode_chunked)
   1009         del self._buffer[:]
-> 1010         self.send(msg)
   1011 


D:ProgramDataAnacondalibhttpclient.py in send(self, data)
    949             if self.auto_open:
--> 950                 self.connect()
    951             else:


D:ProgramDataAnacondalibsite-packagesurllib3connection.py in connect(self)
    199     def connect(self):
--> 200         conn = self._new_conn()
    201         self._prepare_conn(conn)


D:ProgramDataAnacondalibsite-packagesurllib3connection.py in _new_conn(self)
    173         except SocketTimeout:
--> 174             raise ConnectTimeoutError(
    175                 self,


ConnectTimeoutError: (, 'Connection to www.santostang.com timed out. (connect timeout=0.001)')


During handling of the above exception, another exception occurred:


MaxRetryError                             Traceback (most recent call last)

D:ProgramDataAnacondalibsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    438             if not chunked:
--> 439                 resp = conn.urlopen(
    440                     method=request.method,


D:ProgramDataAnacondalibsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    754 
--> 755             retries = retries.increment(
    756                 method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]


D:ProgramDataAnacondalibsite-packagesurllib3utilretry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    573         if new_retry.is_exhausted():
--> 574             raise MaxRetryError(_pool, url, error or ResponseError(cause))
    575 


MaxRetryError: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))


During handling of the above exception, another exception occurred:


ConnectTimeout                            Traceback (most recent call last)

 in 
      1 import requests
      2 URL="http://www.santostang.com/"
----> 3 r=requests.get(URL,timeout=0.001)


D:ProgramDataAnacondalibsite-packagesrequestsapi.py in get(url, params, **kwargs)
     74 
     75     kwargs.setdefault('allow_redirects', True)
---> 76     return request('get', url, params=params, **kwargs)
     77 
     78 


D:ProgramDataAnacondalibsite-packagesrequestsapi.py in request(method, url, **kwargs)
     59     # cases, and look like a memory leak in others.
     60     with sessions.Session() as session:
---> 61         return session.request(method=method, url=url, **kwargs)
     62 
     63 


D:ProgramDataAnacondalibsite-packagesrequestssessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    540         }
    541         send_kwargs.update(settings)
--> 542         resp = self.send(prep, **send_kwargs)
    543 
    544         return resp


D:ProgramDataAnacondalibsite-packagesrequestssessions.py in send(self, request, **kwargs)
    653 
    654         # Send the request
--> 655         r = adapter.send(request, **kwargs)
    656 
    657         # Total elapsed time of the request (approximately)


D:ProgramDataAnacondalibsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    502                 # TODO: Remove this in 3.0.0: see #2811
    503                 if not isinstance(e.reason, NewConnectionError):
--> 504                     raise ConnectTimeout(e, request=request)
    505 
    506             if isinstance(e.reason, ResponseError):


ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
 
实践爬取豆瓣Top250页面 

我们观察发现,网站一页最多显示25部电影,且其每个页面的url为:https://movie.douban.com/top250?start=value

其中value为0,25,50,…

import requests
url="https://movie.douban.com/top250?"
key_dict={"start":0}
headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
for i in range(10):
    key_dict["start"]=25*i
    r=requests.get(url,params=key_dict,headers=headers)
    path=str(i)+".txt"
    print(r.status_code)
    fp=open(path,"w",encoding="utf-8")
    fp.write(r.text)
    fp.close()
200
200
200
403
200
200
200
200
200
403

页面内容:

#将电影名提取出来并保存为txt
from bs4 import BeautifulSoup
url="https://movie.douban.com/top250?"
key_dict={"start":0}
headers={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"}
movie_list=[]
for i in range(10):
    key_dict["start"]=25*i
    r=requests.get(url,params=key_dict,headers=headers)
    print(r.status_code)
    soup=BeautifulSoup(r.text,"lxml")
    content=soup.find_all("div",class_="hd")
    for each in content:
        movie=each.a.span.text.strip()
        movie_list.append(movie)
print(movie_list)
200
200
200
200
200
200
200
200
200
200
['肖申克的救赎', '霸王别姬', '阿甘正传', '这个杀手不太冷', '泰坦尼克号', '美丽人生', '千与千寻', '辛德勒的名单', '盗梦空间', '忠犬八公的故事', '星际穿越', '楚门的世界', '海上钢琴师', '三傻大闹宝莱坞', '机器人总动员', '放牛班的春天', '无间道', '疯狂动物城', '大话西游之大圣娶亲', '熔炉', '教父', '当幸福来敲门', '控方证人', '龙猫', '怦然心动', '触不可及', '末代皇帝', '蝙蝠侠:黑暗骑士', '寻梦环游记', '活着', '指环王3:王者无敌', '哈利·波特与魔法石', '乱世佳人', '素媛', '飞屋环游记', '摔跤吧!爸爸', '何以为家', '哈尔的移动城堡', '十二怒汉', '我不是药神', '少年派的奇幻漂流', '鬼子来了', '大话西游之月光宝盒', '天空之城', '天堂电影院', '猫鼠游戏', '闻香识女人', '指环王2:双塔奇兵', '罗马假日', '钢琴家', '让子弹飞', '指环王1:护戒使者', '辩护人', '大闹天宫', '教父2', '黑客帝国', '狮子王', '死亡诗社', '海蒂和爷爷', '搏击俱乐部', '绿皮书', '饮食男女', '美丽心灵', '窃听风暴', '本杰明·巴顿奇事', '情书', '两杆大烟枪', '穿条纹睡衣的男孩', '西西里的美丽传说', '看不见的客人', '飞越疯人院', '拯救大兵瑞恩', '音乐之声', '小鞋子', '阿凡达', '海豚湾', '致命魔术', '沉默的羔羊', '哈利·波特与死亡圣器(下)', '美国往事', '禁闭岛', '蝴蝶效应', '布达佩斯大饭店', '心灵捕手', '低俗小说', '春光乍泄', '摩登时代', '七宗罪', '喜剧之王', '致命ID', '被嫌弃的松子的一生', '杀人回忆', '加勒比海盗', '红辣椒', '狩猎', '剪刀手爱德华', '请以你的名字呼唤我', '勇敢的心', '7号房的礼物', '功夫', '超脱', '断背山', '哈利·波特与阿兹卡班的囚徒', '天使爱美丽', '入殓师', '唐伯虎点秋香', '第六感', '幽灵公主', '重庆森林', '小森林 夏秋篇', '阳光灿烂的日子', '爱在黎明破晓前', '一一', '蝙蝠侠:黑暗骑士崛起', '菊次郎的夏天', '哈利·波特与密室', '消失的爱人', '超能陆战队', '无人知晓', '小森林 冬春篇', '完美的世界', '倩女幽魂', '爱在日落黄昏时', '侧耳倾听', '借东西的小人阿莉埃蒂', '甜蜜蜜', '萤火之森', '驯龙高手', '幸福终点站', '玛丽和马克思', '时空恋旅人', '大鱼', '怪兽电力公司', '告白', '阳光姐妹淘', '射雕英雄传之东成西就', '神偷奶爸', '傲慢与偏见', '教父3', '玩具总动员3', '釜山行', '恐怖直播', '一个叫欧维的男人决定去死', '哪吒闹海', '被解救的姜戈', '血战钢锯岭', '未麻的部屋', '头号玩家', '我是山姆', '寄生虫', '七武士', '喜宴', '新世界', '电锯惊魂', '哈利·波特与火焰杯', '模仿游戏', '黑客帝国3:矩阵革命', '花样年华', '卢旺达饭店', '上帝之城', '三块广告牌', '风之谷', '疯狂原始人', '你的名字。', '谍影重重3', '英雄本色', '头脑特工队', '达拉斯买家俱乐部', '纵横四海', '心迷宫', '岁月神偷', '记忆碎片', '惊魂记', '忠犬八公物语', '海街日记', '荒蛮故事', '九品芝麻官', '爆裂鼓手', '贫民窟的百万富翁', '真爱至上', '东邪西毒', '绿里奇迹', '小偷家族', '爱在午夜降临前', '无敌破坏王', '黑天鹅', '冰川时代', '你看起来好像很好吃', '疯狂的石头', '萤火虫之墓', '色,戒', '雨人', '雨中曲', '恐怖游轮', '恋恋笔记本', '魔女宅急便', '2001太空漫游', '城市之光', '可可西里', '虎口脱险', '人工智能', '二十二', '遗愿清单', '初恋这件小事', '海边的曼彻斯特', '大佛普拉斯', '奇迹男孩', '罗生门', '终结者2:审判日', '牯岭街少年杀人事件', '房间', '无间道2', '源代码', '青蛇', '东京教父', '新龙门客栈', '疯狂的麦克斯4:狂暴之路', '魂断蓝桥', '波西米亚狂想曲', '无耻混蛋', '步履不停', '血钻', '茶馆', '彗星来的那一夜', '千钧一发', '战争之王', '燃情岁月', '黑客帝国2:重装上阵', '谍影重重2', '崖上的波妞', '背靠背,脸对脸', '海洋', '小丑', '阿飞正传', '穿越时空的少女', '谍影重重', '地球上的星星', '香水', '再次出发之纽约遇见你', '完美陌生人', '我爱你', '爱乐之城', '朗读者', '火星救援', '聚焦', '小萝莉的猴神大叔', '驴得水', '浪潮', '猜火车', '千年女优']
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664648.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号