文章目录

  • 多线程实现简单的爬虫保存在字典中(电影天堂)
  • 爬取电影信息保存在数据库中
  • 将爬取的电影信息展示到网页中

多线程实现简单的爬虫保存在字典中(电影天堂)

=============================使用多线程得到下载的电影地址(没有使用的时候,很慢)==================================
import re
import urllib.request
import time
import threadingclass Spider(object):def __init__(self):self.film_dict = {} # 定义字典存储下载的影片信息self.i = 1 # 查看获取影片的数量self.lock1 = threading.Lock() # 互斥的写入字典def start(self):# 设置多线程,爬虫多个页面列表for page in range(1,4):t1 = threading.Thread(target=self.get_movie_link, args=(page,))t1.start()#  得到字典对应的数组list1 = self.film_dict.items()# 所有线程执行完毕后再退出while len(threading.enumerate()) != 1:time.sleep(1)# 遍历下载字典,获取影片名称、下载地址for film_name, film_download_url in list1:print(film_name, "|", film_download_url)def get_movie_link(self, page):#设置要爬的电影列表urlfilm_list_url = "https://www.ygdy8.net/html/gndy/dyzz/list_23_%d.html" % page# 打开url ,获取数据 <http.client.HTTPResponse object at 0x000002596CA13400>response_list = urllib.request.urlopen(film_list_url)# 读取列表返回的数据response_list_data = response_list.read()# 解码数据response_list_text = response_list_data.decode("gb2312", "ignore")#输出的就是右击查看网页源代码的内容# 使用正则匹配获得每一条的电影名和相应链接# <a href="/html/gndy/dyzz/20200809/60326.html" class="ulink">2020年奇幻剧情《秘密花园》BD中英双字幕</a>url_list = re.findall("<a href=\"(.*)\" class=\"ulink\">(.*)</a>", response_list_text)# url_list 是列表,每一个元素是元组# [('/html/gndy/dyzz/20200809/60326.html', '2020年奇幻剧情《秘密花园》BD中英双字幕'),# ('/html/gndy/dyzz/20200809/60325.html', '2020年剧情传记《放射性物质》BD中英双字幕')..]for film_content_url, film_name in url_list:film_content_url = "https://www.ygdy8.net" + film_content_url#  打开电影的url地址response_content = urllib.request.urlopen(film_content_url)response_content_data = response_content.read()response_content_text = response_content_data.decode("gb2312", "ignore")# 使用正则 取出下载地址ret = re.search("bgcolor=\"#fdfddf\"><a href=\"(.*?)\">", response_content_text)if ret:# 保存影片名称和下载地址到字典中self.lock1.acquire()self.film_dict[film_name] = ret.group(1)self.lock1.release()print("已经成功爬取 %d 个影片地址!" % self.i)self.i += 1else:continue
def main():film_spider = Spider()film_spider.start()if __name__ == '__main__':main()#注意:如果没有‘ignore’会报错
#UnicodeDecodeError: 'gb2312' codec can't decode byte 0xa9 in position 11775: illegal multibyte sequence
#因此使用ignore 忽略非 gb2321编码的字符

爬取电影信息保存在数据库中

首先创建数据库和存储电影信息的表

create database movie_db charset=utf8; # 创建数据库
use movie_db; # 选择数据库
# 创建数据表
create table movie_link(
id int(11) primary key auto_increment,
film_name varchar(255) not null,
film_link varchar(255) not null
)charsset=utf8;
=====================简单爬取电影信息插入到数据库中,重复的数据不插入=============================================
import re
import urllib.request
from pymysql import connectdef add_film(film_name, film_link):""" 定义专门的函数,保存影片信息到数据库中(插入)"""sql ="insert into movie_link values(null, %s, %s)"ret = cur.execute(sql, [film_name, film_link])# 如果插入成功,给出提示if ret:print("保存成功!影片[%s]" % film_name)def film_exist(film_name, film_link):"""定义专门的函数,检测数据是否已经存在(查询)"""sql = "select id from movie_link where film_name=%s and film_link=%s limit 1"ret = cur.execute(sql,[film_name, film_link])#如果获取的记录数 >0 返回真if ret:return Trueelse:return Falsedef get_movie_links():"""获取列表页影片信息"""# 1.定义列表的地址film_list_url = "https://www.ygdy8.net/html/gndy/dyzz/list_23_1.html"# 2.打开url地址,获取数据  <http.client.HTTPResponse object at 0x0000026B03B4EC50>response_list = urllib.request.urlopen(film_list_url)# 2.1通过read()读取网络资源数据response_list_data = response_list.read()# 3.解码获取到的内容response_list_text = response_list_data.decode("gb2312", "ignore")# 4.使用正则得到所有的影片内容地址#print(response_list_text) #输出的就是右击查看网页源代码的内容# 4.1 使用findall()根据正则查找所有影片对应的内容也地址url_list = re.findall(r"<a href=\"(.*)\" class=\"ulink\">(.*)</a>", response_list_text)# 4.2保存地址# [('/html/gndy/dyzz/20200809/60326.html', '2020年奇幻剧情《秘密花园》BD中英双字幕'),# ('/html/gndy/dyzz/20200809/60325.html', '2020年剧情传记《放射性物质》BD中英双字幕')..]#print(url_list)# 以上用列表包起来,每一个是元组# 定义一个字典,用于保存影片信息films_dict = {}# 计数i = 1# 循环遍历 url_listfor content_url, film_name in url_list:# 电影的url地址是:https://www.ygdy8.net/html/gndy/dyzz/20200809/60326.htmlcontent_url = "https://www.ygdy8.net" + content_url# 打开内容页地址response_content = urllib.request.urlopen(content_url)# 接收内容页数据response_content_data = response_content.read()# 解码得到内容页的文本内容response_content_text = response_content_data.decode("gb2312", "ignore")#print(response_content_text)# 取出下载地址result = re.search(r"bgcolor=\"#fdfddf\"><a href=\"(.*?)\">",response_content_text)if result:films_dict[film_name] = result.group(1)print("已经获取 %d 条信息" % i)i += 1else:breakreturn films_dictdef main():film_dict = get_movie_links()# 遍历字典for film_name, film_link in film_dict.items():# 如果数据库中存在相同的数据就不再插入if film_exist(film_name, film_link):print("保存失败!影片:[%s]" % film_name)continue# 调用函数保存数据add_film(film_name, film_link)
if __name__ == '__main__':# 创建连接对象conn = connect(host="localhost", user="root", password="mysql", database="movie_db")# 创建游标对象cur = conn.cursor()# 调用爬出数据的函数main()# 提交数据conn.commit()# 关闭游标cur.close()# 关闭连接conn.close()

将爬取的电影信息展示到网页中

参考 实现简单的web服务器并返回 固定数据 (页面)给浏览器
思路:把原本固定的内容变为从数据库动态读取

================将返回的固定内容,变成从数据库读取的内容,拼接在一起,形成新的response_body===========================
import socket
import pymysqldef request_handler(new_client_socket, ip_port):# 接收客户端浏览器发送的协议request_data = new_client_socket.recv(1024)# 判断协议是否为空if not request_data:print("%s 客户端已经下线!" % str(ip_port))new_client_socket.close()return# 拼接响应报文response_line = "HTTP/1.1 200 OK\r\n"response_header = "Server:Python20WS/2.1\r\n"response_header += "Content-type:text/html;charset=utf-8\r\n" # 防止乱码,以html页面显示response_blank = "\r\n"response_body = " "# 连接数据库conn = pymysql.connect(host="localhost", user="root", password="mysql",database="movie_db")# 创建游标cur = conn.cursor()sql = "select * from movie_link order by id desc"cur.execute(sql)result_list = cur.fetchall() #获取执行结果的所有内容((1, 'film_name', 'film_link'),(... ).....)# 遍历每一个元组for row in result_list:response_body += "%d.%s  下载地址:[<a href='%s'>%s</a>] <br>" % (row[0], row[1], row[2], row[2])# 关闭操作cur.close()conn.close()response_data = response_line + response_header + response_blank + response_body# 发送响应报文new_client_socket.send(response_data.encode())# 关闭套接字new_client_socket.close()
def main():# 创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置地址重用tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, True)# 绑定端口tcp_server_socket.bind(("", 8080))# 设置监听,让套接字由主动变为被动tcp_server_socket.listen(128)while True:# <socket.socket fd=500, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.1.26.31', 8080), raddr=('10.1.26.31', 64089)># ('10.1.26.31', 64089) 当有客户端连接的话返回新的socket对象,和ip地址,端口号new_client_socket, ip_port = tcp_server_socket.accept()print(" 新客户来了:", ip_port)# 接收信息并作出响应request_handler(new_client_socket, ip_port)# 关闭套接字tcp_server_socket.close()
if __name__ == '__main__':main()

简单爬虫+ 线程+SQL+网页相关推荐

  1. python抓取图片_Python3简单爬虫抓取网页图片

    现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...

  2. python3.4.4实现网页爬虫基础之网页下载器三种方法

    这是是慕课网<Python开发简单爬虫>中网页下载器的三种实现方法,课程用的是python2.7,这里用最新的3.4.4实现出来,分享给新人: import urllib.request ...

  3. 简单的爬虫架构和网页下载器requests

    目录 简单的爬虫架构: 网页下载器: URL管理器: 网页解析器: 网页下载器requests: 发送requests请求: 接收requests请求: requests操作实例: 简单的爬虫架构: ...

  4. Python 爬取网页信息并保存到本地爬虫爬取网页第一步【简单易懂,注释超级全,代码可以直接运行】

    Python 爬取网页信息并保存到本地[简单易懂,代码可以直接运行] 功能:给出一个关键词,根据关键词爬取程序,这是爬虫爬取网页的第一步 步骤: 1.确定url 2.确定请求头 3.发送请求 4.写入 ...

  5. python最简单的爬虫代码,python小实例一简单爬虫

    python新手求助 关于爬虫的简单例子 #coding=utf-8from bs4 import BeautifulSoupwith open('', 'r') as file: fcontent ...

  6. python简单实践作业_【Python】:简单爬虫作业

    使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...

  7. pyrthon 简单爬虫实现

    简单爬虫的通用步骤 BY ZKEEER 2017-09-03 2 COMMENTS 本文首发:ZKeeer's Blog--简单爬虫的通用步骤 代码基于 python3.5 多图预警,长文预警 知识点 ...

  8. 爬虫软件python功能_python实现简单爬虫功能的示例

    python开源工具列表[持续更新] 以下是个人在工作中整理的一些python wheel,供参考.这个列表包含与网页抓取和数据处理的Python库 网络 通用urllib -网络库(stdlib). ...

  9. 公众号简单爬虫--把公众号文章全部转载到网站(三)

    公众号简单爬虫--把公众号文章全部转载到网站(三) 根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的json文件.接下来,就是要提取文章详细信息和把一系列的信息写入数据库. ...

最新文章

  1. [笔记] consul用grpc做健康检查注意点
  2. wingide的使用方法积累
  3. 人工智能 | 自然语言处理(NLP)研究团队
  4. HDU - 2089 不要62 【暴力打表】【数位DP】
  5. hadoop常见错误即解决方法
  6. db2有主键时默认hash分区_彻底搞懂 MySQL 分区!
  7. Tensorboard--模型可视化工具
  8. 服务器安装opencv报错--libSM.so.6: cannot open shared ...+tensorflow 报错libcusolver.so.8.0: can not...
  9. lumen php命令,php – 如何使用命令行手动运行laravel / lumen作业
  10. 双栏模板图片标题无法居中_没想到吧,只用一张图片,你就可以做一份PPT!
  11. 最大化窗口快捷键_ubuntu Gnome快捷键
  12. 配置Syslog输出到远程日志服务器
  13. ETH开发 JSONRPC
  14. 织梦Dedecms源码文件夹目录模板解释说明
  15. 桂花网蓝牙路由器Cassia X1000产品介绍
  16. 点击复制某段文本方法
  17. 永恒之塔总是服务器未响应,《剑网3》《永恒之塔》怀旧服刚开上演“冲级热”,八月怀旧游戏集体搞事...
  18. 机器人的发展历史及未来发展趋势
  19. skimage 学习第二天:ski官网示例程序总结(1)
  20. 青海湖:月光尽情倾洒惹人念

热门文章

  1. 总结 : 论文--Financial Distress Prediction
  2. 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛
  3. googletest简介
  4. USB4Dock,USB4扩展坞方案 介绍
  5. nyoj 451 光棍节的快乐
  6. 【博学谷学习记录】超强总结,用心分享| jQuery简介
  7. 基于Unity3D的自动寻路车辆模拟
  8. It‘s highly recommended that you fix the library with ‘execstack -c <libfile>‘, or link it with ‘-z
  9. Linux 高性能服务器网络编程(一)
  10. 苹果老板乔布斯在斯坦福大学的演讲