python利用requests和threading模块,实现多线程爬取电影天堂最新电影信息。
利用爬到的数据,基于Django搭建的一个最新电影信息网站:
今天想利用所学知识来爬取电影天堂所有最新电影信息,用到的模块:
requests:用于获取网页信息
re:获取网页中具体想要的信息
Beautifulsoup:便于标签搜索,获取想要信息
threading:使用多线程大幅度缩短爬取时间
queue:使用线程队列来写入文件(实际上我是把数据全部存入了数据库)
大概差不多就这些模块。
欢迎各位大牛指点。
- # Author : 'n1celll'
- import requests
- import json
- import re
- from bs4 import BeautifulSoup
- import threading
- import queue,time
- header = header = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
- url = 'http://www.ygdy8.net/html/gndy/dyzz/index.html'
- def get_page(url):
- index = requests.get(url, headers=header)
- index.enconding = 'GBK'# 将编码转为与HTML一致
- t = index.text
- index_soup = BeautifulSoup(t, 'html.parser')# 将获得的网页信息 转成soup对象
- all_pages = index_soup.find('select', attrs={'name': 'sldd'}).find_all('option')[-1] # 获得总页数
- page = int(all_pages.string)
- return page
- def get_data(page):
- page_url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_%s.html' % (page) # 获取每一页数据
- print(page)
- # page_url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_30.html'
- res = requests.get(page_url, headers=header)
- res.encoding = 'GBK' # 'gb2312'
- a = res.text
- soup = BeautifulSoup(a, 'html.parser')
- name = soup.find_all('a', attrs={'class': 'ulink'})
- # print(name)测试
- for i in name:
- try:
- moive_name = re.search('《(.*?)(》|】)', i.string).group()
- # 有两个坑,这个里面有个电影名字不是用的书名号,还有一个电影有两个a标签
- except:
- continue
- html = 'http://www.ygdy8.net' + i['href']
- da = requests.get(html, headers=header)
- da.encoding = 'GBK' # da.apparent_encoding
- db = da.text
- # f = open('test2.txt','w',encoding='utf8')
- # f.write(a.text)
- # f.close()
- dr = BeautifulSoup(db, 'html.parser')
- span = dr.find('span', attrs={'style': 'FONT-SIZE: 12px'})
- if span:
- dc = span.text.split()
- data = ''
- for i in dc:
- data += i
- print(data)
- msg = {}
- if data:
- msg['mname'] = moive_name
- try:
- show_t = re.search(r'(?<=(◎年代|◎时间|品年代|年代】|播时间|播】:))(.*?)(?=◎|年|【)', data).group()
- except:
- show_t = re.search(r'(?<=日期|份:)(.*?)(?=(-|剧))', data).group()
- msg['mtime'] = show_t
- try:
- country = re.search(r'(?<=(◎国家|◎产地|◎地区|◎国别|国家】))(.*?)(?=◎|【类)', data).group()
- except:
- try:
- country = re.search(r'(?<=地区)(.*?)(?=语言)', data).group()
- except:
- country = '未知'
- msg['mcountry'] = country
- try:
- time = re.search(r'(?<=◎片长|长度】)(.*?)(?=◎|【)', data).group()
- except:
- time = '未知'
- msg['mtime'] = time
- try:
- mtype = re.search(\
- r'(?<=(◎类别|别类型|影类型|◎类型|集类型|◎分类|类型:|类别】|片类型|型】:))(.*?)(?=(◎|级别|【出品|【主演))', \
- data).group()
- except:
- try:
- mtype = re.search(r'(?<=类型:)(.*?)(?=国)', data).group()
- except:
- mtype = re.search(r'动作|爱情|战争', data).group()
- #以上的正则表达式,感觉用的很笨拙,希望有技术大牛提点建议
- # with open('test4.txt','a+',encoding='utf8') as f:测试
- # f.write('%s: %s,%s,%s,%s\n' % (moive_name, country, mtype, time, show_t))测试
- q.put('%s: %s,%s,%s,%s,%s\n' % (moive_name, country, mtype, time, show_t,html))
- q = queue.Queue(maxsize=10000)
- t_obj = []
- lock = threading.Lock()#加上线程锁
- # semaphore = threading.BoundedSemaphore(200)
- def writing(f):
- # semaphore.acquire()
- data = q.get()
- lock.acquire()
- f.write(data)
- lock.release()
- # semaphore.release()
- # if not q.get():
- # f.close()
- # break
- # print('写入完成')
- all_page = get_page(url)
- f = open('test4.txt', 'w', encoding='utf8')
- print(all_page+1)
- for i in range(1,all_page+1):
- t = threading.Thread(target=get_data,args=(i,))
- t.start()
- t_obj.append(t)
- for t in t_obj:
- t.join()#保证所有线程结束后开始写入
- print('%s over'%t)
- while q.qsize():#判断队列里面是否还有元素
- w = threading.Thread(target=writing, args=(f,))
- w.start()
- w.join()
- else:
- print('写入完成')
python利用requests和threading模块,实现多线程爬取电影天堂最新电影信息。的更多相关文章
- 使用selenium 多线程爬取爱奇艺电影信息
使用selenium 多线程爬取爱奇艺电影信息 转载请注明出处. 爬取目标:每个电影的评分.名称.时长.主演.和类型 爬取思路: 源文件:(有注释) from selenium import webd ...
- Python之爬虫(二十一) Scrapy爬取所有知乎用户信息(下)
在上一篇文章中主要写了关于爬虫过程的分析,下面是代码的实现,完整代码在:https://github.com/pythonsite/spider items中的代码主要是我们要爬取的字段的定义 cla ...
- Python之爬虫(二十) Scrapy爬取所有知乎用户信息(上)
爬取的思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账号 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- python学习笔记之使用threading模块实现多线程(转)
综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- python利用requests库模拟post请求时json的使用
我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...
- <python的线程与threading模块>
<python的线程与threading模块> 一 线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而thre ...
- Python爬虫入门教程: All IT eBooks多线程爬取
All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着 ...
随机推荐
- 箭头函数里this理解
先来看代码: var obj1={ id:4, fn:function(){ var f=() => { console.log(this); //object,f()定义在obj1对象中,th ...
- javascript事件流机制
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- 三种Webpack打包方式
准备工作mkdir webpack_demo && cd webpack_demo #新建文件夹npm init #创建package.json文件npm install --save ...
- java第七次课堂笔记
- 关于Servlet的一些归纳(1)
1.servlet接口 含5个抽象放法 void init(ServletConfig config) throws ServletException //初始化Servlet void servic ...
- vue-cli axios跨域 + 反向代理模拟http请求host+referer
axios跨域 配置config->index.js中的proxyTable,内容如下: proxyTable: { // 跨域请求 '/api': { // 注意此处可设置为 '*' 代表不限 ...
- python入门(五)
一.函数返回值 1.函数如果返回多个值,他会把这几个值放到一个元组里面 2.也可以用多个变量来接收 返回多个值放到元组里面 def say(): num1=1 num2=2 num3=3 return ...
- MIME 参考手册
本文摘自http://www.w3school.com.cn/media/media_mimeref.asp MIME (Multipurpose Internet Mail Extensions) ...
- RedLock.Net - 基于Redis分布式锁的开源实现
工作中,经常会遇到分布式环境中资源访问冲突问题,比如商城的库存数量处理,或者某个事件的原子性操作,都需要确保某个时间段内只有一个线程在访问或处理资源. 因此现在网上也有很多的分布式锁的解决方案,有数据 ...
- 小程序wx.chooseImage的坑
选择图片后可能重新执行onshow()和onhide(),可以在页面中添加锁变量,选择图片前获取,选择完释放,onshow中利用锁来中断执行