爬虫实践-豆瓣读书Top250

news2024/11/18 15:24:44

爬虫学习与实践

  • 一、爬虫介绍
  • 二、爬虫原理
    • TCP3次握手,4次挥手过程
  • 三、页面解析之数据提取
  • 四、正则表达式
  • 五、实践
    • 1. 抓取百度贴吧
    • 2. 拉钩招聘网
  • 六、 进阶版

一、爬虫介绍

网络爬虫,其实叫作网络数据采集更容易理解。就是通过编程向网络服务器请求数据(HTML表单),然后解析HTML,提取出自己想要的数据

爬虫步骤:

  1. 根据url获取HTML数据
  2. 解析HTML,获取目标信息
  3. 存储数据
  4. 预处理
  5. 排名,提供检索服务

二、爬虫原理

爬虫是 模拟用户在浏览器或者某个应用上的操作,把操作的过程、实现自动化的程序
网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。
网络爬虫的基本工作流程如下:
a . 首先选取一部分精心挑选的种子URL;
b. 将这些URL放入待抓取URL队列;
c. 从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
d. 分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

TCP3次握手,4次挥手过程

(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报(2)服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3)客户必须再次回应服务段一个ACK报文,这是报文段3
连接终止协议(四次挥手):
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

三、页面解析之数据提取

一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值,内容一般分为两部分,非结构化的文本,或结构化的文本。

关于结构化的数据
JSON、XML

关于HTML文本(包含JavaScript代码):
HTML文本(包含JavaScript代码)是最常见的数据格式,理应属于结构化的文本组织,但因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。
把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。
常见解析方式如下:XPath、CSS选择器、正则表达式
比如一段文本:
例如一篇文章,或者一句话,我们的初衷是提取有效信息,所以如果是滞后处理,可以直接存储,如果是需要实时提取有用信息,常见的处理方式如下:

分词根据抓取的网站类型,使用不同词库,进行基本的分词,然后变成词频统计,类似于向量的表示,词为方向,词频为长度。

NLP自然语言处理,进行语义分析,用结果表示,例如正负面等。

四、正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

常见匹配符:
^ — 与字符串开始的地方匹配,不匹配任何字符;
$ — 与字符串结束的地方匹配,不匹配任何字符;
\b — 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符;
\B — \b取非,即匹配一个非单词边界;
在这里插入图片描述

五、实践

1. 抓取百度贴吧

源码

# -*- coding:utf-8 -*-
import urllib2
import urllib
from lxml import etree
import chardet
import json
import codecs
def GetTimeByArticle(url):
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    resHtml = response.read()
    html = etree.HTML(resHtml)
    time = html.xpath('//span[@class="tail-info"]')[1].text
    print time
    return time
def main():
    output = codecs.open('tieba0812.json', 'w', encoding='utf-8')
    for pn in range(0, 250, 50):
        kw = u'网络爬虫'.encode('utf-8')
        url = 'http://tieba.baidu.com/f?kw=' + urllib.quote(kw) + '&ie=utf-8&pn=' + str(pn)
        print url
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        resHtml = response.read()
        print resHtml
        html_dom = etree.HTML(resHtml)
        # print etree.tostring(html_dom)
        html = html_dom
        # site = html.xpath('//li[@data-field]')[0]
        for site in html.xpath('//li[@data-field]'):
            # print etree.tostring(site.xpath('.//a')[0])
            title = site.xpath('.//a')[0].text
            Article_url = site.xpath('.//a')[0].attrib['href']
            reply_date = GetTimeByArticle('http://tieba.baidu.com' + Article_url)
            jieshao = site.xpath('.//*[@class="threadlist_abs threadlist_abs_onlyline "]')[0].text.strip()
            author = site.xpath('.//*[@class="frs-author-name j_user_card "]')[0].text.strip()
            lastName = site.xpath('.//*[@class="frs-author-name j_user_card "]')[1].text.strip()
            print title, jieshao, Article_url, author, lastName
            item = {}
            item['title'] = title
            item['author'] = author
            item['lastName'] = lastName
            item['reply_date'] = reply_date
            print item
            line = json.dumps(item, ensure_ascii=False)
            print line
            print type(line)
            output.write(line + "\n")
        output.close()
    print 'end'
if __name__ == '__main__':
    main()

2. 拉钩招聘网

源码:

from lxml import etree
import requests
import re
response = requests.get('http://www.lagou.com/jobs/2101463.html')
resHtml = response.text
html = etree.HTML(resHtml)
title = html.xpath('//h1[@title]')[0].attrib['title']
#salary= html.xpath('//span[@class="red"]')[0].text
salary = html.xpath('//dd[@class="job_request"]/p/span')[0].text
worklocation = html.xpath('//dd[@class="job_request"]/p/span')[1].text
experience = html.xpath('//dd[@class="job_request"]/p/span')[2].text
education = html.xpath('//dd[@class="job_request"]/p/span')[3].text
worktype = html.xpath('//dd[@class="job_request"]/p/span')[4].text
Temptation = html.xpath('//dd[@class="job_request"]/p[2]')[0].text
print salary,worklocation,experience,education,worktype,Temptation
description_tag = html.xpath('//dd[@class="job_bt"]')[0]
description =  etree.tostring( description_tag,encoding='utf-8')
#print description
deal_descp =  re.sub('<.*?>','',description)
print deal_descp.strip()
publisher_name =  html.xpath('//*[@class="publisher_name"]//@title')[0]
pos =  html.xpath('//*[@class="pos"]')[0].text
chuli_lv =  html.xpath('//*[@class="data"]')[0].text
chuli_yongshi =  html.xpath('//*[@class="data"]')[1].text
print chuli_lv,chuli_yongshi,pos,publisher_name

六、 进阶版

爬虫框架,其中比较好用的是 Scrapy 和 PySpider
PySpider
优点:分布式框架,上手更简单,操作更加简便,因为它增加了 WEB 界面,写爬虫迅速,集成了phantomjs,可以用来抓取js渲染的页面。

缺点:自定义程度低

http://docs.pyspider.org/en/latest/Quickstart/

Scrapy

优点:自定义程度高,比 PySpider更底层一些,适合学习研究,需要学习的相关知识多,拿来研究分布式和多线程等等是最合适不过的。

缺点:非分布式框架(可以用scrapy-redis分布式框架)

爬虫技术越来越高级,需要我们不断学习、探索,今天就简单分享到这吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MasterAlign相机参数设置-增益调节

相机参数设置-曝光时间调节操作说明 相机参数的设置对于获取清晰、准确的图像至关重要。曝光时间是其中一个关键参数&#xff0c;它直接影响图像的亮度和清晰度。以下是关于曝光时间调节的详细操作步骤&#xff0c;以帮助您轻松进行设置。 步骤一&#xff1a;登录系统 首先&…

JumpServer存在未授权访问漏洞(CVE-2023-42442) 附POC

文章目录 JumpServer存在未授权访问漏洞&#xff08;CVE-2023-42442&#xff09;CVE-2023-42442 附POC1. JumpServer简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 JumpServer存在未授权访问漏洞&#xff08;CVE-2023-42442&#xff09;…

[补题记录] Atcoder Beginner Contest 300(E)

URL&#xff1a;https://atcoder.jp/contests/abc300 目录 E Problem/题意 Thought/思路 Code/代码 E Problem/题意 给一个 N&#xff0c;然后投色子&#xff0c;筛到每个数&#xff08;即 1 - 6&#xff09;的概率均等&#xff0c;把所筛到的数一个个相乘&#xff0c;直…

SSRF攻击(服务端请求伪造)

1.SSRF(服务端请求伪造)原理 概念&#xff1a;是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。&#xff08;因为他是从内部系统访问的&#xff0c;所有可以通过它攻击外网无法访问的内部系统&#xff0c;也就是把目…

CTF学习路线!最详细没有之一!(建议收藏)

一、CTF入门 最近很多朋友在后台私信我&#xff0c;问应该怎么入门CTF。 个人认为入门CTF之前大家应该先了解到底什么是CTF&#xff0c;而你学CTF的目的又到底是什么; 其次便是最好具备相应的编程能力&#xff0c;若是完全不具备这些能力极有可能直接被劝退。 毕竟比赛的时…

百望云获评ITShare数智未来创新峰会“年度数字化优秀服务商”大奖

近日&#xff0c;百望云应邀出席“新能源-新制造暨汽车数智未来创新峰会”&#xff0c;凭借在数字化领域优秀的服务能力和丰富的落地成果&#xff0c;成功获评“年度数字化优秀服务商”&#xff0c;这也是市场对百望云在赋能企业数字化转型和产品创新领域的再度认可&#xff01…

微信小程序之项目基本结构、页面的基础及宿主环境

文章目录 前言一、基本组成结构基本组成小程序页面的组成部分JSON配置文件作用 二、页面基础pagesWXML和HTML的区别WXSS和CSS的区别小程序中js文件分类 三、小程序宿主环境总结 前言 微信小程序的项目基本结构、页面的基础及宿主环境 一、基本组成结构 基本组成 新建一个微信…

在“百模大战”重生,搜索引擎又行了?

文丨智能相对论 作者丨沈浪 “我想让人们知道&#xff0c;是我们&#xff08;微软&#xff09;让他们&#xff08;谷歌&#xff09;‘跳舞’。” 当加入ChatGPT功能的新一代Bing上线&#xff0c;微软CEO纳德拉就已经按耐不住向谷歌发起了挑战。他认为加入新一代人工智能对搜…

Qt核心:元对象系统、属性系统、对象树、信号槽

一、元对象系统 1、Qt 的元对象系统提供的功能有&#xff1a;对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C进行的一些扩展&#xff0c;主要是为实现信号和槽机制而引入的&#xff0c; 信号和槽机制是 Qt 的核心特征。 3、要使…

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟&#xff0c;现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能&#xff1a;快速读取所有位数据、寄存器数据的当前数值。 操作&#xff1a;双击“数值”列表头。 一键…

【MySQL】 MySQL的增删改查(进阶)--贰

文章目录 &#x1f6eb;新增&#x1f6ec;查询&#x1f334;聚合查询&#x1f6a9;聚合函数&#x1f388;GROUP BY子句&#x1f4cc;HAVING &#x1f38b;联合查询⚾内连接⚽外连接&#x1f9ed;自连接&#x1f3c0;子查询&#x1f3a1;合并查询 &#x1f3a8;MySQL的增删改查(…

关于JPA +SpringBoot 遇到的一些问题及解决方法

关于JPA SpringBoot 遇到的一些问题及解决方法 一、JpaRepository相关 1.1 org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : id; nested exception is org.hibernate.QueryException: Named parameter not bound : id可以…

MobileViT论文记录

论文原文&#xff1a;https://arxiv.org/abs/2110.02178 源码地址&#xff08;pytorch实现&#xff09;&#xff1a;https://github.com/apple/ml-cvnets 前言 MobileVit是由CNN和Transformer混合架构组成的&#xff0c;它利用了CNN的空间归纳偏置[1]和加速网络收敛的优势&a…

【C++面向对象侯捷】11.组合和继承

文章目录 Composition复合&#xff0c;表示has-aDelegation&#xff08;委托&#xff09;&#xff0c;Composition by referenceInheritance继承&#xff0c;表示 is-a Composition复合&#xff0c;表示has-a Delegation&#xff08;委托&#xff09;&#xff0c;Composition b…

数字IC验证高频面试问题整理—附答案(四)

好久没更新面试题目了&#xff0c;不少同学在后台催更&#xff0c;这不就来了~ 共150道验证高频面试题整理~含答案&#xff08;文末可领取全部题目&#xff09; Q1.illegal_bins和ignore_bins命中分别会怎么样&#xff1f;命中是否会计入覆盖率统计 illegal_bins 表示非法的…

activemq部署

目录 1.下载 2.java环境 3.解压启动 4.访问测试 5.问题记录 5.1.无法启动成功问题 5.2.其他服务器无法访问 1.下载 ActiveMQ 2.java环境 需要注意要求的jdk版本&#xff0c;否则启动不会成功 3.解压启动 tar -zxvf apache-activemq-5.18.2-bin.tar.gz 进入到目录下执行…

MATLAB实现相关性分析

目录 一.基本理论 二.两类相关系数的对比 三.相关系数的假设检验 四.MATLAB的相关操作 五.其他有关的一些列技巧 六.案例展示 七.实战操作 一.基本理论 所谓相关系数&#xff0c;本质上是来衡量两组数据的关系大小——对应呈现函数关心的两种变量&#xff0c;那么我们可以…

“信任危机”?VR数字工厂让你沉浸式漫游在工厂里

网上因为“预制菜”的问题吵的沸沸扬扬&#xff0c;企业工厂说预制菜都是经过精心准备和加工的食物&#xff0c;但是更多人还是不信任预制菜的制作&#xff0c;归根结底还是因为信任危机&#xff0c;如果说有这样一个全新的展示方式&#xff0c;可以将工厂加工环境1:1还原复刻在…

vuex如何安装、报错、安装版本注意事项

npm i vuex报错&#xff0c;为什么呢&#xff1f; 在2022.2.7&#xff0c;Vue3就变成了默认版本&#xff0c; Vue2中&#xff0c;必须要用Vuex的3版本 Vue3中&#xff0c;必须要用Vuex的4版本&#xff0c;否则会报错 npm i vuex 安装的就是4版本 如果我们需要安装3版本&…

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库&#xff0c;用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式&#xff0c;并提供从图像中​​读取多个字符和字体、粗体和斜体样式…