Python编写网络爬虫–牛刀小试

Python编写网络爬虫–牛刀小试本文参考网上的资料,编写简单的Python编写网络爬虫,做了网页内容的抓取,分析出链接的url并抓取。

大家好,又见面了,我是你们的朋友全栈君。

   本文参考网上的资料,编写简单的Python编写网络爬虫,做了网页内容的抓取,分析出链接的url并抓取。

      1.环境准备

          安装python3,PyCharm开发环境

      2.牛刀小试:          

# encoding:UTF-8
import urllib.request         #引入urllib工具

url = "http://www.baidu.com" #Url地址
data = urllib.request.urlopen(url).read()  # 使用urllib工具获取url的页面内容
data = data.decode('UTF-8')       #将格式转换为UTF-8格式
print(data)                 # 打印获取的页面信息

      输出结果:

<html><head>        <meta http-equiv="content-type" content="text/html;charset=utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=Edge">	<meta content="always" name="referrer">    <meta name="theme-color" content="#2932e1">    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />    <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" />     <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu.svg">			<link rel="dns-prefetch" href="//s1.bdstatic.com"/>	<link rel="dns-prefetch" href="//t1.baidu.com"/>	<link rel="dns-prefetch" href="//t2.baidu.com"/>	<link rel="dns-prefetch" href="//t3.baidu.com"/>	<link rel="dns-prefetch" href="//t10.baidu.com"/>	<link rel="dns-prefetch" href="//t11.baidu.com"/>	<link rel="dns-prefetch" href="//t12.baidu.com"/>	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>        <title>百度一下,你就知道</title>    <style id="css_index" index="index" type="text/css">html,body{height:100%}html{overflow-y:auto}body{font:12px arial;text-align:;background:#fff}body,p,form,ul,li{margin:0;padding:0;list-style:none}body,form,#fm{position:relative}td{text-align:left}img{border:0}a{color:#00c}  ........ ........ 由于内容过多,此处省略<script>if(navigator.cookieEnabled){	document.cookie="NOJS=;expires=Sat, 01 Jan 2000 00:00:00 GMT";}</script></body></html>

  

      上述结果与打开www.baidu.com,然后右键“查看源代码”获取得到的内容相同。

   3.抓取页面中的链接页面


      

import re
import urllib.request
import urllib

from collections import deque   #引入队列

queue = deque()        #定义队列,保存待处理的url
visited = set()        # 保存已抓取的url

url = 'http://www.csdn.net'  # 入口页面, 可以换成别的

queue.append(url)     # 添加到待处理的队列中
cnt = 0               # 已抓取数

while queue:
    url = queue.popleft()  # 获取队列队首元素
    visited.add(url)  # 添加到已经访问set中

    print('已经抓取: ' + str(cnt) + '   正在抓取 <---  ' + url)
    print('已经抓取的url:', visited)
    cnt += 1

    try:
        urlop = urllib.request.urlopen(url)      #抓取
    except:
        print('抓取: ' + url + '   异常 ')
        continue

    if 'html' not in urlop.getheader('Content-Type'):   # 判断是否是html的url
        continue

    # 避免程序异常中止, 用try...catch处理异常
    try:
        data = urlop.read().decode('utf-8')
    except:
        continue

    # 正则表达式提取页面中所有队列, 并判断是否已经访问过, 如果没有访问过,则加入待抓取队列
    linkre = re.compile('href="(.+?)"')
    for x in linkre.findall(data):
        if 'http' in x and x not in visited:
            queue.append(x)
            print('加入队列 --->  ' + x)


输出结果:


已经抓取: 0   正在抓取 <---  http://www.csdn.net已经抓取的url: {'http://www.csdn.net'}加入队列 --->  http://c.csdnimg.cn/www/css/csdn_common.css加入队列 --->  http://c.csdnimg.cn/public/favicon.ico加入队列 --->  https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn ...... 此处省略加入队列 --->  http://powerlinux.csdn 加入队列 --->  http://www.csdn.net/tag/jquery 加入队列 --->  http://www.csdn.net/company/icp.html加入队列 --->  http://www.csdn.net/company/pifu.html加入队列 --->  http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010加入队列 --->  http://c.csdnimg.cn/comm_ask/css/ask_float_block.css已经抓取: 1   正在抓取 <---  http://c.csdnimg.cn/www/css/csdn_common.css已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net'}已经抓取: 2   正在抓取 <---  http://c.csdnimg.cn/public/favicon.ico已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://c.csdnimg.cn/public/favicon.ico'}已经抓取: 3   正在抓取 <---  https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'http://www.csdn.net', 'http://c.csdnimg.cn/public/favicon.ico'}加入队列 --->  http://edu.csdn.net/yearPromotion/detail/3加入队列 --->  /account/fpwd?action=forgotpassword&service=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn加入队列 --->  https://api.weibo.com/oauth2/authorize?client_id=2601122390&response_type=code&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DSinaWeiboProvider加入队列 --->  https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=75fvsy4v01jw1s&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DLinkedInProvider&state=DCEEFWF45453sdffef424加入队列 --->  https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=cePqkUpKCBrcnQtARTNPxxQG&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DBaiduProvider加入队列 --->  https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=100270989&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DQQProvider&state=test加入队列 --->  https://github.com/login/oauth/authorize?client_id=4bceac0b4d39cf045157&redirect_uri=https%3A%2F%2Fpassport.csdn.net%2Faccount%2Flogin%3Foauth_provider%3DGitHubProvider加入队列 --->  /account/mobileregister?action=mobileRegisterView&service=http%3A%2F%2Fmy.csdn.net%2Fmy%2Fmycsdn已经抓取: 4   正在抓取 <---  http://passport.csdn.net/account/mobileregister?action=mobileRegister已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'}加入队列 --->  https://csdnimg.cn/public/common/toolbar/css/index.css加入队列 --->  /account/register?action=registerView&service=http://www.csdn.net已经抓取: 5   正在抓取 <---  https://passport.csdn.net/help/faq已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'https://passport.csdn.net/help/faq'}加入队列 --->  https://passport.csdn.net/account/changepassword加入队列 --->  https://passport.csdn.net/account/forgotpassword加入队列 --->  https://passport.csdn.net/account/forgotpassword已经抓取: 6   正在抓取 <---  http://news.csdn.net已经抓取的url: {'http://c.csdnimg.cn/www/css/csdn_common.css', 'http://www.csdn.net', 'http://passport.csdn.net/account/mobileregister?action=mobileRegister', 'http://c.csdnimg.cn/public/favicon.ico', 'http://news.csdn.net', 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn', 'https://passport.csdn.net/help/faq'}加入队列 --->  http://c.csdnimg.cn/public/common/toolbar/css/index.css


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149561.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux如何安装node_node 环境变量

    linux如何安装node_node 环境变量前言:linux中安装node环境步骤:第一步:官网下载node安装包,点我进入第二步:解压到个人的根目录下,也就是/home/haoxing(这是你自己的名字)/nodejs把文件夹名字改成nodejs方便使用第三步:配置环境变量1,打开终端入口2,输入命令:注意,带sudo是可编辑,不带的是只读sudovim/etc/profile3,输入你的密码4,shift+i打开编辑模式,加上以下代码,注意/home/…

    2022年9月13日
  • 系统运维面试题

    系统运维面试题1.什么是运维?什么是游戏运维?1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络、系统、数据库、开发、安全、监控于一身的技术,运维又包括很多种,有DBA运维、网站运维、虚拟化运维、监控运维、游戏运维等等2)游戏运维又有分工,分为开发运维、应用运维(业务运维)和系统运维开发运维:是给应用运维开发运维工具和运维平台的应用运维:是给业务上线、维护和做故障排除的,用开发运维开发出来的工具给业务上线、维护、做故障

    2022年6月1日
  • 格雷码与二进制的转换[通俗易懂]

    格雷码与二进制的转换[通俗易懂]一、什么是格雷码?格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同,这点在下面会详细讲解到。格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这点很重要。常用的二进制数与格雷码间的转换关系如下表:二、二进制格雷码与自然二进制码的互换1、二进制码转换成二进制格雷码  二进制码转换成二进制格雷码,

    2022年10月17日
  • hql删除mysql语句_如何使用delete语句删除数据

    hql删除mysql语句_如何使用delete语句删除数据如何使用delete语句删除数据发布时间:2021-01-1510:57:41来源:亿速云阅读:83作者:小新栏目:数据库这篇文章主要介绍如何使用delete语句删除数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!怎么使用delete语句删除数据?创建一个临时表,用于演示sqlserver语法中delete删除的使用方法IFOBJECT_ID(‘tempdb..#tb…

    2022年6月16日
  • Git知识总览(一) 从 git clone 和 git status 谈起「建议收藏」

    Git知识总览(一) 从 git clone 和 git status 谈起「建议收藏」本篇博客是整理git相关知识的第一篇,因为之前一直是用SourceTree对Git的命令行操作用的不是特别熟,于是乎过了一遍ProGit(链接:https://git-scm.com/book/zh/

    2022年7月1日
  • sstream用法

    sstream用法#include<sstream>stringstream对象用于输入一行字符串,以空格为分隔符把该行分隔开来stringstr=”helloworldIamveryhappy!”;stringstreamsstream(str);…

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号