Python获取网页指定内容(BeautifulSoup工具的使用方法)

urillb2在python3中的变化
在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。
在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,urllib.parse
在Pytho2.x中使用import urlparse——-对应的,在Python3.x中会使用import urllib.parse。
在Pytho2.x中使用import urlopen——-对应的,在Python3.x中会使用import urllib.request.urlopen。
在Pytho2.x中使用import urlencode——-对应的,在Python3.x中会使用import urllib.parse.urlencode。
在Pytho2.x中使用import urllib.quote——-对应的,在Python3.x中会使用import urllib.request.quote。
在Pytho2.x中使用cookielib.CookieJar——-对应的,在Python3.x中会使用http.CookieJar。
在Pytho2.x中使用urllib2.Request——-对应的,在Python3.x中会使用urllib.request.Request。
————————————————
版权声明:本文为CSDN博主「mxinye」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
 
#coding:utf-8  
'''''
@author: jsjxy
'''  
import urllib2   
import re   
from bs4 import BeautifulSoup  
from distutils.filelist import findall  
  
  
  
page = urllib2.urlopen('http://movie.douban.com/top250?format=text')   
contents = page.read()   
#print(contents)  
soup = BeautifulSoup(contents,"html.parser")  
print("豆瓣电影TOP250" + "\n" +" 影片名              评分       评价人数     链接 ")    
for tag in soup.find_all('div', class_='info'):    
   # print tag  
    m_name = tag.find('span', class_='title').get_text()        
    m_rating_score = float(tag.find('span',class_='rating_num').get_text())          
    m_people = tag.find('div',class_="star")  
    m_span = m_people.findAll('span')  
    m_peoplecount = m_span[3].contents[0]  
    m_url=tag.find('a').get('href')  
    print( m_name+"        "  +  str(m_rating_score)   + "           " + m_peoplecount + "    " + m_url )

  

问题:urllib.error.HTTPError: HTTP Error 418:
问题描述:当我使用Python的request爬取网页时返回了http状态码为418,

 

错误描述:经过网上查询得知,418的意思是被网站的反爬程序返回的,网上解释为,418 I'm a teapot
The HTTP 418 I'm a teapot client error response code indicates that the server refuses to brew coffee because it is a teapot. This error is a reference to Hyper Text Coffee Pot Control Protocol which was an April Fools' joke in 1998.
翻译为:HTTP 418 I'm a teapot客户端错误响应代码表示服务器拒绝煮咖啡,因为它是一个茶壶。这个错误是对1998年愚人节玩笑的超文本咖啡壶控制协议的引用。
解决办法:当时我用的是urllib的request,我感觉这个库应该有点久了,所以换了requests这个库,然后再次请求,并添加了header的信息就可以了,如果不加程序放回的是空,没有结果,运行不会错.
使用request:
from urllib import request
r = request.urlopen(url)
html = r.read().decode("utf-8")
print(html)
使用requests并添加headers信息后:
import requests
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
r = requests.get(url,headers=headers)
html = r.text
print(html)
 
正确的代码如下:
 
#!/usr/bin/env python
# coding:utf-8
 
import requests
import re
from bs4 import BeautifulSoup
from distutils.filelist import findall

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
page = requests.get('http://movie.douban.com/top250?format=text',headers=headers)
contents = page.text
# print(contents)
soup = BeautifulSoup(contents, "html.parser")
print("豆瓣电影TOP250" + "\n" + " 影片名              评分       评价人数     链接 ")
for tag in soup.find_all('div', class_='info'):
    # print tag
    m_name = tag.find('span', class_='title').get_text()
    m_rating_score = float(tag.find('span', class_='rating_num').get_text())
    m_people = tag.find('div', class_="star")
    m_span = m_people.findAll('span')
    m_peoplecount = m_span[3].contents[0]
    m_url = tag.find('a').get('href')
    print(m_name + "        " + str(m_rating_score) + "           " + m_peoplecount + "    " + m_url)
 
 
 
 
 
 
posted @ 2020-03-16 20:29  heycomputer  阅读(538)  评论(0编辑  收藏  举报