Python每日一题 008
题目
基于多线程的网络爬虫项目,爬取该站点http://www.tvtv.hk 的电视剧收视率排行榜
分析
robots.txt
User-agent: Yisouspider
Disallow: /wp-admin
User-agent: ChinasoSpider
Disallow: /
User-agent: MJ12bot
Disallow: /
User-agent: AhrefsBot
Disallow: /
User-agent: YandexBot
Disallow: /
一级URL:http://www.tvtv.hk/archives/category/dianshiju/page/1
二级URL格式:http://www.tvtv.hk/archives/8078.html
从一级URL页面中获取二级URL
分析二级URL页面下的内容获取数据:
代码
# coding:"utf-8"
import urllib.request
from bs4 import BeautifulSoup
import re
# 爬取网页内容
def download(url):
print("正在爬取:", url)
try:
html = urllib.request.urlopen(url).read()
html = BeautifulSoup(html, 'lxml')
except urllib.request.URLError as e:
print("爬取错误:", e.reason)
html = None
return html
# 获取下一级网页中的URL
def find_url(page, tag):
page = str(page.find_all(tag))
url_list = re.findall('<a href="(.*?)" rel="bookmark"', page)
return url_list
# 爬取收视数据
def get_content(url_list):
word_data = []
for i in url_list:
html = download(i)
contents = html.find_all('p')
word_data.extend(re.findall('<p>(.*?)</p>, <p>', str(contents)))
return word_data
# 爬取图片
def img_data(url_list):
img_src = []
for j in url_list:
html = download(j)
contents = html.find_all('p')
img_src.extend(re.findall('src="(.*?)"/></p>', str(contents)))
return img_src
def write_content_tofile(filename1, filename2):
# 保存文本内容
with open(filename1, 'w+', encoding='utf-8') as f1:
data = get_content(url_list)
for i in data:
f1.write(i + "\n")
# 保存图片
img = img_data(url_list)
for j in range(len(img)):
print('正在下载第'+str(j+1)+'张图片')
path = str(j+1)
with open(filename2 + path + '.jpg', 'wb') as f2:
image_data = urllib.request.urlopen(img[j]).read()
f2.write(image_data)
if __name__ == "__main__":
url = "http://www.tvtv.hk/archives/category/dianshiju/page/1"
filename1 = "E:\\1.txt"
filename2 = "E:\\img\\"
page = download(url)
url_list = find_url(page, 'h2')
write_content_tofile(filename1, filename2)
暂时只是爬取单个页面的内容,后续更新多线程以及批量爬取!
Python每日一题 008的更多相关文章
- Python:每日一题008
题目: 判断101-200之间有多少个素数,并输出所有素数. 程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 个人思路及代码: li ...
- Python每日一题 004
将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中. 代码 import redis import uuid # 创建实例 r=redis.Redis(&quo ...
- Python每日一题 003
将 002 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中. 代码 import pymysql import uuid def get_id(): for i in ra ...
- Python每日一题 002
做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 在此生成由数字,字母组成的20位字 ...
- Python每日一题 009
题目 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. 代码 参照网络上代码 # coding: utf-8 import os import re # ...
- Python每日一题 007
题目 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词. 很难客观的说每篇日记中最重要的词是什么,所以在这里就仅仅是将每篇日记中出 ...
- Python每日一题 006
题目 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. 如果只是单纯的通过将图片缩放到iPhone5分辨率大小,显然最后呈现出来的效果会很糟糕.所以等比例缩放到长( ...
- Python每日一题 005
任一个英文的纯文本文件,统计其中的单词出现的个数. 代码 # coding:utf-8 import re def get_word(filename): fp=open(filename," ...
- Python每日一题 001
Github地址:https://github.com/Yixiaohan/show-me-the-code Talk is Cheap, show me the code. --Linus Torv ...
随机推荐
- Tortoise git账号记住密码
方法一: 本地git仓库目录下,找到 .git/config ,然后打开增加: [credential] helper = store 这样只有该目录下的git操作不用每次输入用户名和密码,换一个目录 ...
- 王爽《汇编》检测9.1(1) | 若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?
;监测点9.1(1) assume cs:code data segment db dup() data ends code segment start: mov ax,data :这一段一定要补上 ...
- 梅尔频谱(mel-spectrogram)提取,griffin_lim声码器【python代码分析】
在语音分析,合成,转换中,第一步往往是提取语音特征参数.利用机器学习方法进行上述语音任务,常用到梅尔频谱.本文介绍从音频文件提取梅尔频谱,和从梅尔频谱变成音频波形. 从音频波形提取Mel频谱: 对音频 ...
- sql查询语句得到返回值fetchone()
需求: 现在mysql中有一张表,表名是info,我想通过报案号4201820330114401021497在这张表里查询出它对应的id. sql = "select claim_id fr ...
- js俩习题
需求,现在要求两个按钮,点击1,背景为红色,点击2,背景为黄色 *****html代码——————————————————————————————————————————————————<!DO ...
- 【项目管理和构建】——Maven简介(一)
在现实的企业中,以低成本.高效率.高质量的完成项目,不仅仅需要技术大牛,企业更加需要管理大牛,管理者只懂技术是远远不够的.当然,管理可以说有很多的方面,例如:对人员的管理,也有对项目的管理等等.如果你 ...
- bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记
这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...
- MSSQL数据库表结构无法更改
工具->Designers-> 组织保存要求重新创建表的更改 -> 把这个钩去掉就可以了
- 后台处理json数据
InputStream in = request.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamRea ...
- JS中获取元素使用getElementByID()、getElementsByName()、getElementsByTagName()的用法和区别
Web标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问Documnent中的任一个标签: 1 g ...