Windows+r打开cmd命令提示符,利用pip install 命令安装两个库即可。
具体安装命令如下:
pip install requests
pip install beautifulsoup4
回车即开始安装。
如果回车后为空则说明未安装pip模块,解决方法可以百度一下。
安装成功后在pycharm中新建一个文件输入
import requests
from bs4 import BeautifulSoup
若未出现红色下划线与报错信息则基本可以确定安装成功。
个人理解:
requests库的作用就是模拟人去访问网页的动作,因此其包含了网页爬虫的基本方法,如获取网页内容、提交用户上传表单等等;
而Beautifulsoup库的作用就是模拟人访问网页得到信息的过程,最终目的是通过访问网页获得你想得到的信息。
总而言之,不太严谨的说,requests负责和网页交互,而beautifulsoup负责得到你想要的信息。
获取豆瓣电影top250的中文名称和其对应的排名并将其写入一个txt文件。
网址:豆瓣电影top250
目前来说,使用浏览器自带的开发调试工具进行分析即可,打开浏览器(本文用的chrome),按下F12或Fn+F12即可调出该工具,效果如下:
我们要获得的是电影名,在网页的主体部分,所以应该关注body标签,将鼠标放到各个标签上,左边对应的部分就会变色,如下图:
可以看出我们将鼠标放在了一个id为wrapper的div标签上右边对应的区域就会变色,可以发现电影名在这个区域内,于是我们层层展开标签,发现class名为hd的div标签就是最小的一个div标签了:
然后我们只需要获取里面的这个div标签下的第一个span标签就是电影的中文名。
这样我们就找到了我们要找的信息,开始写代码。
首先,我们直接用requests的get方法获取网站的状态码,看看结果:
import requests
url='https://movie.douban.com/top250'
data=requests.get(url).status_code
print(data)
输出结果为418,这说明网站存在反爬程序,因此我们需要加一个请求头来模拟浏览器访问,如下:
import requests
url='https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}
data=requests.get(url=url,headers=headers).status_code
print(data)
这里输出结果为200,表明成功访问。
将后面的status_code换成content再输出一遍试试。
发现输出了一堆不是人话的东西。
再改成
data=requests.get(url=url,headers=headers).content.decode()
发现输出的是带标签的整个网页信息,那么怎么提取出其中的人话呢,这时候就需要beautifulsoup出场了。
首先先建立一个beautifulsoup对象:
page=requests.get(url=url,headers=headers).content
soup=BeautifulSoup(page)
根据前面的分析,要找class名为hd的div标签,且要找到这一页所有的这个标签,所以用find_all方法:
content=soup.find_all('div', class_="hd")
随后用一个循环读出每一个类名hd的div中的第一个span标签中的数据,并加上序号即可:
i=0
for k in content:
a=k.find_all('span')
# print(a)
i=i+1
print(i,a[0].string)
import requests
from bs4 import BeautifulSoup
url='https://movie.douban.com/top250'
def download_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}
data=requests.get(url,headers=headers).content
return data
if __name__=='__main__':
# print(download_page(url).decode())
soup=BeautifulSoup(download_page(url))
# print(soup.prettify())
content=soup.find_all('div', class_="hd")
# print(content)
print(soup.title.string)
i=0
for k in content:
a=k.find_all('span')
# print(a)
i=i+1
print(i,a[0].string)
多页连续访问:
观察每一页的网页url,发现第二页为
https://movie.douban.com/top250?start=25&filter=
因此第一页可看作start=0,第三页为start=50…以此类推,所以用一个循环实现了翻页(本质是访问了一组不同的网页):
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i*25) + '&filter='
写入txt:
加入python文件操作,用open()方法打开文档,write()方法改写,close()方法关闭文档。
import requests
from bs4 import BeautifulSoup
f = open("文件位置路径\文件名.txt","w")
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i*25) + '&filter='
data = requests.get(url, headers=headers).content
soup = BeautifulSoup(data)
content = soup.find_all('div', class_="hd")
# print(soup.title.string)
j = 0
for k in content:
a = k.find_all('span')
# print(a)
j = j + 1
print(j+25*i, a[0].string)
f.write(str(j+25*i))
f.write(" ")
f.write(a[0].string)
f.write("\n")
f.close()