在花了近半年的课余时间学习了Python的基础语法后开始尝试网页的抓取,学了一个星期,刚开始的抓取比较小的网页尝到甜头后,疯狂的找各种网页抓取,当然也被各种虐得反爬虐 - -!
于是决定认真复习之前的笔记,把爬取过的网页及方法记录下来,写博客有助于自己后面的复习,当然如果有爬虫比我还小白的朋友看我的这些基础可能也会收获点 ~
抓取2019精品新片的前10页所有电影的名字、电影海报(感兴趣的可以加入磁力链接,同理不难)
爬取思路层次分析——从里向外:
url分析
进入单部电影的页面中右键点击检查,从elements里很容易找出电影名和海报的位置
电影名有很多个地方都能提取,不一一说明
通过xpath语法解析出
可以看到xpath匹配出两个图片信息,第二个是视频截图的,我们只需要第一个即可。
total_url分析
提取完单个电影所需要的信息后,分析如何从一页里面如何抓取所有的电影url,已第一页为例,目标抓提取出第一页所有的url
右键点击检查,将elements定位工具放置任意一个电影位置,可找出如下
这样就发现除了每个电影url位置了,再通过xpath匹配出来
OK,此时可以说已经完成将一页(total_urls)中的所有url里的电影需求信息拿到手了。
下一步就是分析爬取10页的了。
遍历10页分析
此时观察前两页的url可发现规律了吧,只需要将圆圈处作为偏移量即可完成需求。好了,分析完毕。
代码实现:
放代码前需要注意的是:我们都知道requests请求下来后一般用response.text 或者 response.content ,这里我选用第二个,电影天堂这个的源代码不够规范,所以我们手动进行解码,打开一个电影url的源代码,ctrt+F 输入 ‘charset’ 可以发现如下图
该网页由gbk编码,那我们解码时使用decode(‘gbk’)就行啦。
代码如下
# -- 1 对电影天堂url规律分析 from lxml import etree import requests x = 0 y = 0 movies = [] HEARDERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36', 'Accept-Language':'zh-CN,zh;q=0.9' } frist = 'https://www.dytt8.net' def get_detail_urls(url): """获取一页的电影""" global y response = requests.get(url, headers=HEARDERS) text = response.text # 去网页源代码查看编码方式 html = etree.HTML(text) # 解析成HTML代码对象 detail_urls = html.xpath("//table[@class='tbspan']//a/@href") # 返回list detail_urls = map(lambda url:frist+url,detail_urls) # 将每个detail_urls元素都放进lambad函数里面执行一遍 y += 1 print('='*30) print('第{}页开始爬取!'.format(y)) print('=' * 30) return detail_urls def parse_detail_page(url): global x movie={} response = requests.get(url,headers=HEARDERS) text = response.content.decode('gbk') html = etree.HTML(text) title = html.xpath("//div[@class='title_all']//font/text()")[0] # 电影名 img = html.xpath("//p/img/@src")[0] movie['电影名'] = title movie['海报'] = img x += 1 movies.append(movie) print('第{}部电影爬取完毕!'.format(x)) def main(): """爬取前5页""" global x for i in range(1,11): # 控制页数 url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'.format(i) detail_urls = get_detail_urls(url) # return详细电影页面list for detail_url in detail_urls: # 该for循环遍历一页中所有电影的详情 try: movie = parse_detail_page(detail_url) # 处理单个电影url except: print('爬取失败') x += 1 if __name__ == '__main__': main() print('爬取完毕,共{}部电影'.format(x)) print(movies)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485结果如下,就不做数据存储环节,主要为理清爬虫思路
在期间某个电影返回了索引错误, - -~ 于是又花了几分钟看了下那部电影,检查发下如下:
果然是空的索引!!! - - 无语 ,那就加了个 try,except, 结果如下:
爬取完成!
更多原创文章请关注我的公众号:DataUser
一枚数据分析的爱好者~
相关知识
基于Python爬虫的电商网站彩妆数据的分析与研究
dawngo/基于python对红楼梦的人物分析
基于python编程的五种鲜花识别
用Python爬虫获取网络园艺社区植物养护和种植技巧
人工智能毕业设计基于python的花朵识别系统
【python机器学习】KNN算法实现回归(基于鸢尾花数据集)
基于Python和Arduino的智能花盆系统
基于python实现网络课程秒刷
基于python“花开富贵”花园管理系统
【叶片病虫害数据集】果树叶片病变识别 机器视觉 Python (含数据集)
网址: 基于Python抓取电影天堂数据 https://m.huajiangbk.com/newsview897911.html
上一篇: JSON 语法 |
下一篇: JSON格式化 json在线解析 |