操作内容:爬取豆瓣电影Top 250所有电影的电影名称
代码实现:
import urllib.request
from bs4 import BeautifulSoup
import pymysql
#全局变量,存放电影
movielist=[]
url='https://movie.douban.com/top250'
#获取
def get_html(url):
res=urllib.request.urlopen(url)
html = res.read().decode() # decode解码
return html
#分析
def parse_html(htmlfile):
mysoup=BeautifulSoup(htmlfile,'html.parser')
movie_zone=mysoup.find('ol') #ol代表所有电影的区域
movie_list=movie_zone.find_all('li') #每个li代表一部电影
for movie in movie_list:
movie_name=movie.find('span',attrs={'class':'title'}).getText()
movielist.append(movie_name) #获取每部电影的名字并存到list中
#上述为当前页面,下面查找后面页
nextpage=mysoup.find('span',attrs={'class':'next'}).find('a')
#只要不是最后一页就不为空
if nextpage:
new_url=url+nextpage['href']
parse_html(get_html(new_url))#递归获取并解析
#存储
def save_data(movielist):
#创建数据库连接
con=pymysql.connect(host='localhost',user='root',password='mysql',db='test')
#创建一个游标,通过游标访问数据库
mycursor=con.cursor()
#访问数据库,创建表,存储数据使用utf8编码方式
sql='CREATE TABLE movie250 (id varchar(10),name varchar(20))default charset=utf8'
mycursor.excute(sql)
sql=''
for id,movie in enumerate(movielist):
sql="insert into movie250 values(%s,%s)"
mycursor.excute(sql,(id,movie))
con.commit()
mycursor.close()
con.close()
reshtml=get_html(url)
parse_html(reshtml)
print(movielist)
save_data(movielist)
具体步骤:
1.模拟http请求,请求发送到目标网址
(1)urllib.result openurl(url)
(2)Requests 定制 header 反爬虫
2.获取返回的html read()
3.数据解析——从海量数据中提取需要的部分
(1)正则
(2)字符串搜索
(3)BeautifulSoup 做解析
4.数据存储——存储到文件,打印输出,存储到数据库
存到数据库:MySQL pymysql 访问数据库 mysql-connect