python网页数据抓取( Python网站信息的资料请关注编程宝库(图)!)
优采云 发布时间: 2022-02-17 14:21python网页数据抓取(
Python网站信息的资料请关注编程宝库(图)!)
Python爬虫实现爬取电影网站信息并入库
一.环境设置1.下载安装包
访问Python官网下载地址:
下载适合您系统的安装包:
我使用的是Windows环境,所以直接从exe包安装。
下载完成后,双击下载包进入Python安装向导。安装非常简单,只需要使用默认设置,点击“下一步”,直到安装完成。
2.修改环境变量
右键单击“计算机”,然后单击“属性”;
然后点击“高级系统设置”-“环境变量”;
选择“系统变量”窗口下的“路径”添加python安装路径;
设置成功后,在cmd命令行输入命令“python”。如果显示,则配置成功。
3.安装依赖模块
我们的爬虫需要安装的依赖模块包括requests、lxml、pymysql。步骤如下:
进入python安装目录下的Scripts目录,点击地址栏输入“cmd”打开命令行工具:
在这个路径下安装对应的requests、lxml、pymysql依赖:
输入命令:
// 安装requests依赖
pip install requests
// 安装lxml依赖
pip install lxml
// 安装pymysql依赖
pip install pymysql
二.代码开发
开发collectMovies.py
#!/user/bin env python
# 获取电影天堂详细信息
import requests
import time
from lxml import etree
import pymysql
requests.adapters.DEFAULT_RETRIES = 5
# 伪装浏览器
HEADERS ={
'User-Agent':'Mozilla/5.(Windows NT 10.0; WOW64) AppleWebKit/537.3(KHTML, like Gecko) Chrome/63.0.3239.13Safari/537.36',
'Host':'www.dy2018.com'
}
# 定义全局变量
BASE_DOMAIN = 'https://www.dy2018.com/'
# 获取首页网页信息并解析
def getUrlText(url,coding):
s = requests.session()
#print("获取首页网页信息并解析:", url)
respons = s.get(url,headers=HEADERS)
print("请求URL:", url)
if(coding=='c'):
urlText = respons.content.decode('gbk')
html = etree.HTML(urlText) # 使用lxml解析网页
else:
urlText = respons.text
html = etree.HTML(urlText) # 使用lxml解析网页
s.keep_alive = False
return html
# 获取电影详情页的href,text解析
def getHref(url):
html = getUrlText(url,'t')
aHref = html.xpath('//table[@class="tbspan"]//a/@href')
print("获取电影详情页的href,text解析```")
htmlAll = map(lambda url:BASE_DOMAIN+url,aHref) # 给每个href补充BASE_DOMAIN
return htmlAll
# 使用content解析电影详情页,并获取详细信息数据
def getPage(url):
html = getUrlText(url,'c')
moveInfo = {} # 定义电影信息
mName = html.xpath('//div[@class="title_all"]//h1/text()')[0]
moveInfo['movie_name'] = mName
mDiv = html.xpath('//div[@id="Zoom"]')[0]
mImgSrc = mDiv.xpath('.//img/@src')
moveInfo['image_path'] = mImgSrc[0] # 获取海报src地址
if len(mImgSrc) >= 2:
moveInfo['screenshot'] = mImgSrc[1] # 获取电影截图src地址
mContnent = mDiv.xpath('.//text()')
def pares_info(info,rule):
'''
:param info: 字符串
:param rule: 替换字串
:return: 指定字符串替换为空,并剔除左右空格
'''
return info.replace(rule,'').strip()
for index,t in enumerate(mContnent):
if t.startswith('◎译 名'):
name = pares_info(t,'◎译 名')
moveInfo['translation']=name
elif t.startswith('◎片 名'):
name = pares_info(t,'◎片 名')
moveInfo['movie_title']=name
elif t.startswith('◎年 代'):
name = pares_info(t,'◎年 代')
moveInfo['movie_age']=name
elif t.startswith('◎产 地'):
name = pares_info(t,'◎产 地')
moveInfo['movie_place']=name
elif t.startswith('◎类 别'):
name = pares_info(t,'◎类 别')
moveInfo['category']=name
elif t.startswith('◎语 言'):
name = pares_info(t,'◎语 言')
moveInfo['language']=name
elif t.startswith('◎字 幕'):
name = pares_info(t,'◎字 幕')
moveInfo['subtitle']=name
elif t.startswith('◎上映日期'):
name = pares_info(t,'◎上映日期')
moveInfo['release_date']=name
elif t.startswith('◎豆瓣评分'):
name = pares_info(t,'◎豆瓣评分')
moveInfo['douban_score']=name
elif t.startswith('◎片 长'):
name = pares_info(t,'◎片 长')
moveInfo['file_length']=name
elif t.startswith('◎导 演'):
name = pares_info(t,'◎导 演')
moveInfo['director']=name
elif t.startswith('◎编 剧'):
name = pares_info(t, '◎编 剧')
writers = [name]
for i in range(index + 1, len(mContnent)):
writer = mContnent[i].strip()
if writer.startswith('◎'):
break
writers.append(writer)
moveInfo['screenwriter'] = writers
elif t.startswith('◎主 演'):
name = pares_info(t, '◎主 演')
actors = [name]
for i in range(index+1,len(mContnent)):
actor = mContnent[i].strip()
if actor.startswith('◎'):
break
actors.append(actor)
moveInfo['stars'] = " ".join(actors)
elif t.startswith('◎标 签'):
name = pares_info(t,'◎标 签')
moveInfo['tags']=name
elif t.startswith('◎简 介'):
name = pares_info(t,'◎简 介')
profiles = []
for i in range(index + 1, len(mContnent)):
profile = mContnent[i].strip()
if profile.startswith('◎获奖情况') or '【下载地址】' in profile:
break
profiles.append(profile)
moveInfo['introduction']=" ".join(profiles)
elif t.startswith('◎获奖情况'):
name = pares_info(t,'◎获奖情况')
awards = []
for i in range(index + 1, len(mContnent)):
award = mContnent[i].strip()
if '【下载地址】' in award:
break
awards.append(award)
moveInfo['awards']=" ".join(awards)
moveInfo['movie_url'] = url
return moveInfo
# 获取前n页所有电影的详情页href
def spider():
#连接数据库
base_url = 'https://www.dy2018.com/html/gndy/dyzz/index_{}.html'
moves = []
m = int(input('请输入您要获取的开始页:'))
n = int(input('请输入您要获取的结束页:'))
print('即将写入第{}页到第{}页的电影信息,请稍后...'.format(m, n))
for i in range(m,n+1):
print('******* 第{}页电影 正在写入 ********'.format(i))
if i == 1:
url = "https://www.dy2018.com/html/gndy/dyzz/"
else:
url = base_url.format(i)
moveHref = getHref(url)
print("休息2s后再进行操作")
time.sleep(2)
for index,mhref in enumerate(moveHref):
print('---- 正在处理第{}部电影----'.format(index+1))
move = getPage(mhref)
moves.append(move)
# 将电影信息写入数据库
db = pymysql.connect(host='127.0.0.1',user='root', password='123456', port=3306, db='你的数据库名称')
table = 'movies'
i = 1
for data in moves:
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}(id,{keys}) VALUES (null,{values})'.format(table=table, keys=keys, values=values)
try:
cursor = db.cursor()
cursor.execute(sql, tuple(data.values()))
print('本条数据成功执行!')
if i==0:
db.commit()
except Exception as e:
print('将电影信息写入数据库发生异常!',repr(e))
db.rollback()
cursor.close()
i = i + 1
db.commit()
db.close()
print('写入数据库完成!')
if __name__ == '__main__':
spider()
三.运行测试1.新建电影信息表
CREATE TABLE `movies` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`movie_name` varchar(255) DEFAULT NULL,
`image_path` varchar(255) DEFAULT NULL,
`screenshot` varchar(255) DEFAULT NULL,
`translation` varchar(255) DEFAULT NULL,
`movie_title` varchar(255) DEFAULT NULL,
`movie_age` varchar(50) DEFAULT NULL,
`movie_place` varchar(50) DEFAULT NULL,
`category` varchar(100) DEFAULT NULL,
`language` varchar(100) DEFAULT NULL,
`subtitle` varchar(100) DEFAULT NULL,
`release_date` varchar(50) DEFAULT NULL,
`douban_score` varchar(50) DEFAULT NULL,
`file_length` varchar(255) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`screenwriter` varchar(100) DEFAULT NULL,
`stars` mediumtext,
`tags` varchar(255) DEFAULT NULL,
`introduction` mediumtext,
`awards` text,
`movie_url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.代码运行
打开collectMovies.py所在目录,输入命令运行:
python collectMovies.py
结果如下:
查看数据库表,数据已经插入成功:
四.故障排除和修复1.空白字符错误
我第一次使用 Python,对它的规则并不熟悉。混合空格和制表符会报如下错误:
unindent does not match any outer indentation level
解决方案
下载Notepad++,选择“编辑”-“空白字符操作”-“空格到制表符(行首)”。
2.请求错误
修改格式后,再次运行,反复报请求的错误。错误信息主要包括以下内容:
ssl.SSLEOFError: EOF occurred in violation of protocol
······
Max retries exceeded with url
解决方案
我认为这是请求设置的问题。各种百度和pip install incremental也装了,还是不行。
后来我把请求的URL改成,没有报错,所以可以定位是访问原来的URL有问题,把采集源路径替换了,问题就出来了解决了。
以上就是Python爬虫实现爬取电影网站信息并入库的详细内容。更多Python爬取网站信息,请关注其他相关编程宝库文章!
下一节:Python将py文件编译成exe文件 Python编程技术
使用PyCharm工具编写的Python程序脚本,如何将.py文件编译成可执行的.exe文件需要已经安装了Python环境。第一步:在 PyCharm 中下载并安装 pyinstalle 库或使用 CMD 安装 P...