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)