利用爬到的数据,基于Django搭建的一个最新电影信息网站:

   n1celll.xyz

  今天想利用所学知识来爬取电影天堂所有最新电影信息,用到的模块:

    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模块,实现多线程爬取电影天堂最新电影信息。的更多相关文章

  1. 使用selenium 多线程爬取爱奇艺电影信息

    使用selenium 多线程爬取爱奇艺电影信息 转载请注明出处. 爬取目标:每个电影的评分.名称.时长.主演.和类型 爬取思路: 源文件:(有注释) from selenium import webd ...

  2. Python之爬虫(二十一) Scrapy爬取所有知乎用户信息(下)

    在上一篇文章中主要写了关于爬虫过程的分析,下面是代码的实现,完整代码在:https://github.com/pythonsite/spider items中的代码主要是我们要爬取的字段的定义 cla ...

  3. Python之爬虫(二十) Scrapy爬取所有知乎用户信息(上)

    爬取的思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账号 ...

  4. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  5. python学习笔记之使用threading模块实现多线程(转)

    综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势 ...

  6. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  7. python利用requests库模拟post请求时json的使用

    我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...

  8. <python的线程与threading模块>

    <python的线程与threading模块> 一 线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而thre ...

  9. Python爬虫入门教程: All IT eBooks多线程爬取

    All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着 ...

随机推荐

  1. SpringBoot配置Swagger实例(POST接收json参数)

    工程目录结构: 首先,引入jar包,只需要以下两个即可 <dependency> <groupId>io.springfox</groupId> <artif ...

  2. CodeForces - 1101B

    题目: B. Accordion time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  3. Nexus3.x安装及配置

    若排版紊乱可查看我的个人博客原文地址 搭建maven私服主要是为了方便在一个团队中使用maven中央仓库没有的jar包,这些非中央仓库的jar包可能是自己团队开发的公共依赖jar包,可能是第三方私有的 ...

  4. react系列笔记:第三记-redux-saga

    github : https://github.com/redux-saga/redux-saga 文档:https://redux-saga.js.org/ redux-saga:  redux中间 ...

  5. Asp .Net Core Spa (一) - 入门

    第一次写文章, 很久之前就想写来着了, 文章哪里不清楚的, 也请多多提出意见. 最近发现用 .net core + spa (single page application) 这个组合的人也变多了, ...

  6. yarn web ui 参数详解

    我们经常使用yarn调度,但是我们是否对调度队列显示参数真正了解呢?   下面我们来一一看看这些参数都是做什么用的,代表什么意思   hadoop是通过队列管理集群资源,翻开集群Web UI,找到Sc ...

  7. kali linux 配置嵌入式开发环境

    kali linux 2018.2 x64 一.支持i386库 如果你是64位的Kali Linux系统,用如下命令添加i386架构支持到你的开发环境. dpkg --add-architecture ...

  8. tp5.0中使用PHPexcel,以及Loader的一些问题

    在5.0中使用PHPexcel遇到一些问题,记录一下方便以后查看. 非使用PHPexcel的方法: 参考:http://blog.csdn.net/sinat_35861727/article/det ...

  9. 使用PuTTY软件远程登录root被拒:access denied

    PuTTY是一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件. 使用PuTTY软件远程登录root时,提示:ACCESS DENIED,很有可能是由sshd的默认配置造成的. 可以 ...

  10. APP在线课程设计

    VR在线课程是我们的主打产品,分为“人工智能鱼”.“海洋史”.“濒危海洋动物保护”.“生物进化”.“海洋知识科普”和“海洋法律”等六大主题,其中“人工智能鱼”为主打特色课程,每个主题也设置了不同难度系 ...