对于天堂影视数据的爬取和分析
学生做的数据分析的一个课程任务,学校和专业就不提了,主要写一下最开始的从网上爬取数据、清洗数据、分析数据的一些经验,希望能够方便到各位同学
文章主要分三个部分,数据爬取、数据清洗和数据分析
数据网站:天堂电影
数据爬取
网站上的数据爬取主要有三种方式
一种是最简单的静态网站:可以直接采用xpath等等
第二种是动态网站:可以分析通过浏览网站的,找到json文件,然后直接提取到json,如果要爬取的数据很多,这种方式比较适用,但是不一定每个网站都能找到他们的json文件,而且要找到也比较难
第三种就是通过模拟浏览器的方式,需要网站的插件,不同的浏览器有不同的插件,这种方式比较慢,但是几乎可以爬取所有网站的信息。
这里是静态网页的爬取,采用了多线程,数据存储在mongo中
from lxml import etree
import requests
import re
import threading
from queue import Queue
from pymongo import MongoClient
import time
db = MongoClient("127.0.0.1",27017)
my_db = db.Heaven
my_infor = my_db.movies
BASE_DOMAIN = 'https://www.dytt8.net'
# url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_1.html'
HEADERS = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
}
urls = []
def get_detail_urls(url):
global urls
response = requests.get(url,headers=HEADERS)
#request库会默认使用自己的解码方式因此可能会出现乱码,所以用content
text=response.content.decode("gbk","ignore")
#拿到网页源代码之后就要对其进行解析得到element对象
html = etree.HTML(text)
detail_urls = html.xpath("//table[@class='tbspan']//a[2]/@href")
#由于拿到的detail_urls是没有域名的,所以调用map()函数将列表中的每一项都去做同一件事情
for i in range(len(detail_urls)):
detail_urls[i] = BASE_DOMAIN + detail_urls[i]
urls = urls + detail_urls
def main1():
i = 1
while(i<122):
url = r"https://www.dytt8.net/html/gndy/china/list_4_"+str(i)
url = url + r".html"
get_detail_urls(url)
print(i)
i =i+1
def get_Info(url):
movie = {}
response = requests.get(url,headers=HEADERS)
text=response.content.decode("gbk","ignore")
#拿到网页源代码之后就要对其进行解析得到element对象
html = etree.HTML(text)
zoom =html.xpath("//div[@id='Zoom']")[0]
infos = zoom.xpath(".//text()")#这是element对象,可以迭代
for index,info in enumerate(infos):
if info.startswith("◎片 名"):
movie['片名']=info.replace("◎片 名","").strip()
if info.startswith("◎年 代"):
movie['年代']=info.replace("◎年 代","").strip()
if info.startswith("◎产 地"):
movie['产地']=info.replace("◎产 地","").strip()
if info.startswith("◎类 别"):
movie['类别']=inf