python网页数据抓取( Python网站信息的资料请关注编程宝库(图)!)

优采云 发布时间: 2022-02-17 14:21

  python网页数据抓取(

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...

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线