1. 爬虫引入

爬虫:

1 百度:搜索引擎

爬虫:spider   种子网站开始爬,下载网页,分析链接,作为待抓取的网页

分词

index:词---》某个结果

Page rank(1 网站很大(互链)  2 包含多少个词   3 更新频率  )

cache:缓存里面

为啥哈希快:

书的目录

hash(xxx)---->内存地址---》保存

查找hash(xxx)---》获取到内存地址---》找

练习:写一个爬虫脚本,抓取出搜狐上所有的链接

步骤: 1 打开sohu网页   2 分析页面中所有的链接  3 打印所有的链接内容(re.findall 查找全部链接),看看是否有非法的链接地址 4 过滤掉非法的链接地址

# -*- coding: utf-8 -*- #
import requests
import re

resq = requests.get("http://www.sohu.com/")
print resq.text[:500]
links = re.findall(r'href="(.*?)"', resq.text)
print len(links)
valid_link = []
invalid_link = []
for link in links:
    #先看一下前200个链接里面有啥,主要思路是根据打印出来的结果去判定该去除哪些内容
#for link in links[:200]:
    #print link
   
if re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$", link.strip()): #排除结尾是图片的
       
print 6, link
        invalid_link.append(link.strip())
        continue
    if
link.strip() == "" or link.strip() == "#" or link.strip() == "/": #排除#号、空格
        # print 1,link
       
invalid_link.append(link)
        continue
    elif
link.strip().startswith("//"):
          # print 2,link
       
valid_link.append("http:" + link.strip())
        continue
    elif
link.strip().count("javascript") >= 1 or link.strip().count("mailto:") >= 1:#排除javascript
        # print 3,link
       
invalid_link.append(link.strip())
        continue
    elif
re.match(r"/\w+", link): #相对链接进行匹配
        # print 5,link
       
if re.match(r"http://.*?/",resq.url.strip()):
            valid_link.append(re.match(r"http://.*?/",resq.url.strip()).group()+link.strip())
        else:
            valid_link.append(re.match(r"http://.*",resq.url.strip()).group()+link.strip())
        continue
    else
:
    # print 7,link
       
valid_link.append(link.strip())

# for link in valid_link[:100]:
#    print link
print len(valid_link)

# for link in invalid_link:
#    print link
print len(invalid_link)

变形练习: 把首页中带篮球的页面全部下载下来

# -*- coding: utf-8 -*- #
import requests
import re

resq = requests.get("http://www.sohu.com/")
#print resq.text[:500]
links = re.findall(r'href="(.*?)"', resq.text)
#print len(links)
valid_link = []
invalid_link = []
for link in links:
    #先看一下前200个链接里面有啥,主要思路是根据打印出来的结果去判定该去除哪些内容
#for link in links[:200]:
    #print link
   
if re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$", link.strip()): #排除结尾是图片的
        #print 6, link
       
invalid_link.append(link.strip())
        continue
    if
link.strip() == "" or link.strip() == "#" or link.strip() == "/": #排除#号、空格
        # print 1,link
       
invalid_link.append(link)
        continue
    elif
link.strip().startswith("//"):
          # print 2,link
       
valid_link.append("http:" + link.strip())
        continue
    elif
link.strip().count("javascript") >= 1 or link.strip().count("mailto:") >= 1:#排除javascript
        # print 3,link
       
invalid_link.append(link.strip())
        continue
    elif
re.match(r"/\w+", link): #相对链接进行匹配
        # print 5,link
       
if re.match(r"http://.*?/",resq.url.strip()):
            valid_link.append(re.match(r"http://.*?/",resq.url.strip()).group()+link.strip())
        else:
            valid_link.append(re.match(r"http://.*",resq.url.strip()).group()+link.strip())
        continue
    else
:
    # print 7,link
       
valid_link.append(link.strip())

# for link in valid_link[:100]:
#    print link

#print len(valid_link)

# for link in invalid_link:
#    print link
#print len(invalid_link)

file_num =1
for link in valid_link:

#print link
   
resq = requests.get(link)
    if u"篮球" in resq.text:  #如果是二进制的文件,就用content找
       
if u'meta charset="utf-8"' in resq.text: #判断一下当前页面的格式
           
with open(r"e:\\pic\\"+str(file_num )+".html","w") as fp:
                fp.write(resq.text.strip().encode("utf-8"))
        else:
            with open(r"e:\\pic\\"+str(file_num )+".html","w") as fp:
                fp.write(resq.text.strip().encode("gbk"))
        file_num +=1  #文件名累加

print "Done!"

练习2:下载所有美女图片 http://www.meituri.com 

自己:

# -*- coding: utf-8 -*- #
import requests
import re
resq = requests.get("http://www.win4000.com/meinvtag34.html")
#print resq.text[:100]
#<img src="http://i.situmei.com/a/1/7215/0.jpg">
links = re.findall(r'src="(.*?)"', resq.text)
#print len(links) #打印有多少个src
valid_link = []
invalid_link = []
pic_num = 0
for link in links:
    #print link  #打印所有src匹配的结果,结果中发现有js的并不是图片,需要去除
   
if re.search(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)$",link.strip()): #找出所有图片链接
       
pic_num += 1
       # print link #打印出图片链接
       
resq1 = requests.get(link.strip(),allow_redirects=True)
        print resq1
        with open(r"e:\\pic\\" + str(pic_num) + ".png", "wb") as fp:
            fp.write(resq1.content)
print pic_num  #打印图片总个数

老师:

# -*- coding: utf-8 -*- #
import requests
import re
import urllib

resq = requests.get("http://www.win4000.com/meinvtag34.html")

link1s = re.findall(r'img src="(.*?)"', resq.text)
link2s = re.findall(r'data-original="(.*?)"', resq.text) #直接用地址下载不行,一些网站缩略图和进入的大图不一致,加载大图费时

#import re
#print re.findall(r'src="(.*?)"|data-original="(.*?)"','src="1.jpg" data-original="2.jpg"')  或者直接用正则也可以

print link2s
valid_link = []
links = link1s + link2s
print len(links)

for link in links:
    if re.search(r"(\.jpg)|(\.jpeg)|(\.gif)$", link.strip()):
        # print 6,link
       
valid_link.append(link.strip())
        continue

# for link in valid_link[:100]:
#    print link
print len(valid_link)

file_num = 1
for link in list(set(valid_link)):
    print link
    resq1 = requests.get(link.strip(), allow_redirects=True)
    print "final url:", resq1.url
    # print resq1.text
   
with open(r"e:\\pic\\" + str(file_num) + ".jpg", "wb") as fp:
        fp.write(resq1.content)
    file_num += 1
print "Done!"

老师:

# -*- coding: utf-8 -*- #
import requests
import re
import urllib

resq = requests.get("http://www.win4000.com/meinvtag34.html")

link1s = re.findall(r'img src="(.*?)"', resq.text)
link2s = re.findall(r'data-original="(.*?)"', resq.text) #直接用地址下载不行,一些网站缩略图和进入的大图不一致,加载大图费时

#import re
#print re.findall(r'src="(.*?)"|data-original="(.*?)"','src="1.jpg" data-original="2.jpg"')  或者直接用正则也可以

print link2s
valid_link = []
links = link1s + link2s
print len(links)

for link in links:
    if re.search(r"(\.jpg)|(\.jpeg)|(\.gif)$", link.strip()):
        # print 6,link
       
valid_link.append(link.strip())
        continue

# for link in valid_link[:100]:
#    print link
print len(valid_link)

file_num = 1
for link in list(set(valid_link)):
    print link
    resq1 = requests.get(link.strip(), allow_redirects=True)
    print "final url:", resq1.url
    # print resq1.text
   
with open(r"e:\\pic\\" + str(file_num) + ".jpg", "wb") as fp:
        fp.write(resq1.content)
    file_num += 1
print "Done!"

python基础-爬虫的更多相关文章

  1. Python基础+爬虫基础

    Python基础+爬虫基础 一.python的安装: 1.建议安装Anaconda,会自己安装一些Python的类库以及自动的配置环境变量,比较方便. 二.基础介绍 1.什么是命名空间:x=1,1存在 ...

  2. 零python基础--爬虫实践总结

    网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫 ...

  3. Python基础爬虫

    搭建环境: win10,Python3.6,pycharm,未设虚拟环境 之前写的爬虫并没有架构的思想,且不具备面向对象的特征,现在写一个基础爬虫架构,爬取百度百科,首先介绍一下基础爬虫框架的五大模块 ...

  4. Python 基础爬虫架构

    基础爬虫框架主要包括五大模块,分别为爬虫调度器.url管理器.HTML下载器.HTML解析器.数据存储器. 1:爬虫调度器主要负责统筹其他四个模块的协调工作 2: URL管理器负责管理URL连接,维护 ...

  5. Python基础——爬虫以及简单的数据分析

    目标:使用Python编写爬虫,获取链家青岛站的房产信息,然后对爬取的房产信息进行分析. 环境:win10+python3.8+pycharm Python库: import requests imp ...

  6. python基础爬虫,翻译爬虫,小说爬虫

    基础爬虫: # -*- coding: utf-8 -*- import requests url = 'https://www.baidu.com' # 注释1 headers = { # 注释2 ...

  7. python 基础-爬虫-数据处理,全部方法

    生成时间戳 1. time.time() 输出 1515137389.69163 ===================== 生成格式化的时间字符串 1. time.ctime() 输出 Fri Ja ...

  8. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  9. python 爬虫与数据可视化--python基础知识

    摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...

随机推荐

  1. html5 新增表单控件和表单属性

    新的输入型控件 email:电子邮箱文本框,跟普通的没什么区别 当输入不是邮箱的时候,验证通不过 移动端的键盘会有变化         tel:电话号码 一般用于手机端,是一个键盘切换 url:网页的 ...

  2. 多线程-Thread-Runnable

    一.多线程     1.基本概念         进程:正在运行中的程序,一个进程中至少包含一个线程         线程:进程的任务,执行任务的一个通道,一个进程中可以包含多个线程     2.多线 ...

  3. wordpress安装后首页无法进入 The file 'wp-config.php' already exists

    问题是缓存导致,具体还没研究是怎么产生的缓存.chrome浏览器解决方法: 1. 网址后面加参数进入网站 2. 打开控制台-network 3. 刷新页面 4. 控制台-network,右键请求的文件 ...

  4. 微软Coco Blockchain Framework:一键解决企业级区块链三大难题

    近年来,异军突起的“区块链”受到全行业的广泛关注,众多企业级用户在积极拥抱新技术的过程中却面临三大难题:性能.隐私和组织管理.如果不能很好地解决这些“顽固分子”,区块链技术就相对局限,很难发挥出应有的 ...

  5. 一键部署基于GitLab的自托管Git项目仓库

    https://market.azure.cn/Vhd/Show?vhdId=9851&version=11921 产品详情 产品介绍GitLab https://about.gitlab.c ...

  6. 如何在Sierra运行 Specials K 的patch

    https://github.com/ApolloZhu/CORE-Keygen-and-Special-K-for-Sierra-Utility/blob/master/Special%20K%20 ...

  7. Codeforces Round #313 (Div. 2) A.B,C,D,E Currency System in Geraldion Gerald is into Art Gerald's Hexagon Equivalent Strings

    A题,超级大水题,根据有没有1输出-1和1就行了.我沙茶,把%d写成了%n. B题,也水,两个矩形的长和宽分别加一下,剩下的两个取大的那个,看看是否框得下. C题,其实也很简单,题目保证了小三角形是正 ...

  8. python_98_面向对象_学校

    class School(object):#以后都加object(基类) def __init__(self, name, addr): self.name = name self.addr = ad ...

  9. spring5之SAXParseException:cvc-elt.1: 找不到元素 “beans” 的声明

    之前SSM项目一直报错,就是找不到错误  气啊 后来在网上找到了答案:燕来spring5之后就不再需要写版本号了

  10. Ab initio methods|Evidence-based methods|maximum-likelihood|branch-site|H1|H0|GO|dS/dN ratio

    (Gene prediction and comparison) 使用基于基因组序列的从头预测方法(Ab initio methods)(同时分别使用头预测软件( GENSCAN和 AUGUSTUS) ...