当前位置: 首页 > news >正文

响应式网站发展如何设置公司网站

响应式网站发展,如何设置公司网站,wordpress插件中心,网页在线制作app前言 回顾之前讲述了python语法编程 必修入门基础和网络编程#xff0c;多线程/多进程/协程等方面的内容#xff0c;后续讲到了数据库编程篇MySQL#xff0c;Redis#xff0c;MongoDB篇#xff0c;和机器学习#xff0c;全栈开发#xff0c;数据分析前面没看的也不用往…前言 回顾之前讲述了python语法编程 必修入门基础和网络编程多线程/多进程/协程等方面的内容后续讲到了数据库编程篇MySQLRedisMongoDB篇和机器学习全栈开发数据分析前面没看的也不用往前翻系列文已经整理好了 1.跟我一起从零开始学python一编程语法必修 2.跟我一起从零开始学python二网络编程 3.跟我一起从零开始学python三多线程/多进程/协程 4.跟我一起从零开始学python四数据库编程MySQL数据库 5.跟我一起从零开始学python五数据库编程Redis数据库 6.跟我一起从零开始学python六数据库编程MongoDB数据库 7.跟我一起从零开始学python七机器学习 8.跟我一起从零开始学python八全栈开发 9.跟我一起从零开始学python九数据分析 10.跟我一起从零开始学python十Hadoop从零开始入门 11.跟我一起从零开始学python十一简述spark 适用于零基础学习和进阶人群的python资源 ① 腾讯认证python完整项目实战教程笔记PDF ② 十几个大厂python面试专题PDF ③ python全套视频教程零基础-高级进阶JS逆向 ④ 百个项目实战源码笔记 ⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目文档 本系列文根据以下学习路线展开讲述由于内容较多 从零开始学python到高级进阶路线图 一丶采集功底专题 1.网络请求 网络请求是爬虫工程师采集数据的重要手段之一。在PC端爬虫中网络请求通常使用HTTP协议进行通信通过发送HTTP请求获取目标网站的数据。 爬虫工程师需要掌握HTTP协议的基本知识包括HTTP请求和响应的格式、常见的HTTP请求方法如GET、POST等、HTTP请求头和响应头的常见字段等。 在进行网络请求时爬虫工程师通常使用HTTP客户端库如Python中的requests库、Java中的HttpClient等。这些库封装了HTTP协议的细节提供了简单易用的API方便爬虫工程师进行网络请求。 爬虫工程师还需要了解一些反爬虫技术如User-Agent伪装、IP代理等以应对目标网站的反爬虫策略。 一丶requests 1.requests源码解析 对于爬虫工程师来说网络请求是常用的数据采集方式之一。而Python的requests库作为一个高效且易用的HTTP请求库被爬虫工程师广泛使用。在深入学习requests库前建议先了解下其中的源码实现。 requests库是基于urllib3库封装的所以在使用requests库时需要先安装对应的依赖库urllib3。 接下来我们通过分析requests库的源代码来了解其中的一些实现细节。 首先是发送请求的实现即requests库中的Request类。Request类用于封装发送请求的参数并通过一个Session对象发送请求并返回响应。以下是Request类的核心代码 class Request:staticmethoddef send(session, method, url, **kwargs):# ...resp session.request(methodmethod, urlurl, **kwargs)return resp我们可以看到Request类中的send方法调用了Session对象的request方法这个方法是整个库中负责发送请求和返回响应的核心方法。以下是Session类中request方法的核心代码 class Session:def request(self, method, url, paramsNone, dataNone, headersNone, cookiesNone, filesNone, authNone,timeoutNone, allow_redirectsTrue, proxiesNone, hooksNone, streamNone, verifyNone, certNone,jsonNone): # ...return self.send(prep, **send_kwargs)我们可以看到Session对象的request方法的参数和关键字参数与HTTP请求的相关部分一一对应其中最重要的是prep参数即经过预处理的Request对象它包含了请求的相关信息如请求方法请求头请求体等。Session对象的request方法最终调用了self.send方法即发送HTTP请求并返回响应。 requests库实现了带有各种HTTP请求方法的函数接口如requests.get()、requests.post()等这些接口在内部会自动创建一个Session对象然后调用Session对象的request方法从而返回请求响应。 总体来说requests是一个功能强大的HTTP请求库它的源代码实现清晰、易于阅读和理解掌握其中的实现细节可以帮助我们更好的使用这个库。 2.requests常用方法 requests是一个Python第三方库用于发送HTTP请求。以下是requests常用方法 requests.get(url, paramsNone, **kwargs)发送GET请求url为请求的URL地址params为请求参数kwargs为其他可选参数。 requests.post(url, dataNone, jsonNone, **kwargs)发送POST请求url为请求的URL地址data为请求数据json为请求的JSON数据**kwargs为其他可选参数。 requests.put(url, dataNone, **kwargs)发送PUT请求url为请求的URL地址data为请求数据**kwargs为其他可选参数。 requests.delete(url, **kwargs)发送DELETE请求url为请求的URL地址**kwargs为其他可选参数。 requests.head(url, **kwargs)发送HEAD请求url为请求的URL地址**kwargs为其他可选参数。 requests.options(url, **kwargs)发送OPTIONS请求url为请求的URL地址**kwargs为其他可选参数。 requests.request(method, url, **kwargs)发送自定义请求method为请求方法url为请求的URL地址**kwargs为其他可选参数。 requests.session()创建一个Session对象用于保持会话状态。 requests.get(url, headersheaders)发送GET请求并设置请求头。 requests.get(url, cookiescookies)发送GET请求并设置请求的Cookies。 requests.get(url, proxiesproxies)发送GET请求并设置代理服务器。 requests.get(url, timeouttimeout)发送GET请求并设置超时时间。 requests.get(url, verifyverify)发送GET请求并设置SSL证书验证。 requests.get(url, allow_redirectsallow_redirects)发送GET请求并设置是否允许重定向。 requests.get(url, streamstream)发送GET请求并设置是否使用流式传输 3.data/json/param参数传递 在使用requests库发送网络请求时我们可以通过传递不同的参数来实现不同的请求方式和数据传递方式。常用的参数包括data、json和params。 1.data参数 data参数用于传递表单数据通常用于POST请求。它可以是一个字典也可以是一个字符串。如果是字典requests会自动将其转换为表单形式如果是字符串则需要手动指定Content-Type为application/x-www-form-urlencoded。 示例代码 import requestsdata {username: admin,password: 123456 }response requests.post(http://www.example.com/login, datadata)2.json参数 json参数用于传递JSON格式的数据通常用于POST请求。它可以是一个字典也可以是一个字符串。如果是字典requests会自动将其转换为JSON格式如果是字符串则需要手动指定Content-Type为application/json。 示例代码 import requestsdata {username: admin,password: 123456 }response requests.post(http://www.example.com/login, jsondata)3.params参数 params参数用于传递URL参数通常用于GET请求。它可以是一个字典也可以是一个字符串。如果是字典requests会自动将其转换为URL参数如果是字符串则需要手动拼接URL。 示例代码 import requestsparams {page: 1,size: 10 }response requests.get(http://www.example.com/articles, paramsparams)4.隧道代理使用 隧道代理是一种通过隧道连接到代理服务器的方式来进行网络请求的方法。这种方式可以帮助我们隐藏真实的IP地址提高爬虫的稳定性和安全性。 使用隧道代理需要先购买代理服务然后在代码中设置代理服务器的IP地址和端口号。以下是一个使用隧道代理的示例代码 import requestsproxy {http: http://代理服务器IP地址:端口号,https: https://代理服务器IP地址:端口号 }url https://www.example.com response requests.get(url, proxiesproxy)print(response.text)在上面的代码中我们首先定义了一个代理字典包含了http和https两种协议的代理服务器地址和端口号。然后使用requests库的get方法发送请求时将代理字典作为proxies参数传入即可。 需要注意的是使用隧道代理可能会降低请求速度而且代理服务的质量也会影响到爬虫的效果。因此在选择代理服务时需要谨慎建议选择稳定可靠的服务商。 5.证书异常处理 在进行网络请求时有些网站会进行证书认证以确保数据的安全。如果requests库在进行SSL证书验证时遇到了问题会抛出“证书验证异常(Certificate Verification Error)”的异常。这个异常通常是由于请求响应的SSL证书无效或不受信任导致的。 以下是requests库中处理证书异常的方法 1.忽略证书验证 在使用requests库进行网络请求时可以通过设置verify参数为False来忽略SSL证书验证。这个方法会禁止requests库对证书进行验证而是采用不安全的方式进行通信因此在进行敏感操作时应慎重使用。 例如 response requests.get(https://example.com, verifyFalse)2.设置证书文件 可以通过设置cert参数来指定一个证书文件在请求时使用该证书进行验证。这个方法需要事先获得一个有效的证书文件如果无法提供有效证书则无法进行安全通信。 例如 response requests.get(https://example.com, cert(path/to/cert.crt, path/to/key))3.添加自定义证书 可以通过requests库提供的certifi库在运行时初始化一个自定义证书从而进行证书验证。这种方式需要提供证书的SHA256指纹值并将其添加到requests库已有的证书列表中。 例如 import certificert certifi.where() fingerprints {example.com: A1:B2:C3:..., ...} with open(cert, a) as f:for host, fingerprint in fingerprints.items():f.write(f{host} {fingerprint}\n)response requests.get(https://example.com, verifyTrue)在以上代码中certifi.where()用于获取当前Python环境中的证书路径然后将每个需要验证的主机和其证书的SHA256指纹添加到证书文件中。 综上要避免证书异常需要注意常见的安全规则如设置SSL证书验证、使用CA颁发的证书、对外不开放不安全的通信端口等。需要快速扫描设备确保组件升级到最新版本在安全上下文中测试企业所依赖的所有服务并采用有力的加密技术以支持加密通信。 二丶httpx 1.httpx源码解析 httpx是一个Python异步HTTP客户端库它提供了简单易用的API支持异步和同步请求支持HTTP/1.1和HTTP/2协议支持代理、SSL/TLS、Cookie等功能。下面我们来看一下httpx的源码解析。 httpx的核心代码在client.py文件中其中最重要的是Client类。Client类是httpx的主要接口它提供了发送HTTP请求的方法如get、post、put、delete等。下面是Client类的定义 class Client:def __init__(self,timeoutUNSET,follow_redirectsUNSET,max_redirectsUNSET,verifyUNSET,certUNSET,trust_envUNSET,http2UNSET,backendUNSET,default_headersUNSET,base_urlUNSET,appUNSET,authUNSET,cookiesUNSET,allow_redirectsUNSET,proxiesUNSET,dispatchUNSET,limitsUNSET,pool_limitsUNSET,retryUNSET,trust_env_proxiesUNSET,headersUNSET,**extra_options,):...Client类的构造函数接受很多参数这些参数可以用来配置httpx的行为。其中比较重要的参数包括 timeout请求超时时间。follow_redirects是否自动跟随重定向。max_redirects最大重定向次数。verify是否验证SSL证书。cert客户端证书。trust_env是否信任环境变量。http2是否启用HTTP/2协议。backendHTTP客户端后端。default_headers默认请求头。base_url基础URL。appASGI应用程序。authHTTP认证。cookies请求Cookie。allow_redirects是否允许重定向。proxies代理服务器。dispatch请求分发器。limits请求限制。pool_limits连接池限制。retry请求重试。trust_env_proxies是否信任环境变量中的代理服务器。headers请求头。 Client类的方法包括 request发送HTTP请求。get发送GET请求。post发送POST请求。put发送PUT请求。delete发送DELETE请求。head发送HEAD请求。options发送OPTIONS请求。patch发送PATCH请求。 这些方法都是基于request方法实现的只是参数不同。下面是request方法的定义 async def request(self,method,url,*,paramsUNSET,dataUNSET,jsonUNSET,headersUNSET,cookiesUNSET,filesUNSET,authUNSET,timeoutUNSET,allow_redirectsUNSET,certUNSET,verifyUNSET,streamUNSET,trust_envUNSET,max_redirectsUNSET,http2UNSET,backendUNSET,dispatchUNSET,limitsUNSET,pool_limitsUNSET,retryUNSET,trust_env_proxiesUNSET,**options, ):...request方法接受很多参数包括HTTP请求方法、URL、请求参数、请求体、请求头、请求Cookie、文件、HTTP认证、请求超时时间、是否允许重定向、客户端证书、是否验证SSL证书、是否使用流式传输、是否信任环境变量、最大重定向次数、是否启用HTTP/2协议、HTTP客户端后端、请求分发器、请求限制、连接池限制、请求重试、是否信任环境变量中的代理服务器等。 httpx的源码比较清晰代码结构清晰注释详细易于阅读和理解。如果你想深入了解httpx的实现原理可以阅读httpx的源码。 2.httpx常用方法 httpx是一个Python的异步HTTP客户端库它提供了许多常用的方法来发送HTTP请求和处理响应。以下是httpx常用的方法 get(url, paramsNone, **kwargs): 发送GET请求url为请求的URLparams为请求参数kwargs为其他可选参数如headers、timeout等。 post(url, dataNone, jsonNone, **kwargs): 发送POST请求url为请求的URLdata为请求数据json为请求的JSON数据kwargs为其他可选参数如headers、timeout等。 put(url, dataNone, **kwargs): 发送PUT请求url为请求的URLdata为请求数据kwargs为其他可选参数如headers、timeout等。 delete(url, **kwargs): 发送DELETE请求url为请求的URLkwargs为其他可选参数如headers、timeout等。 head(url, **kwargs): 发送HEAD请求url为请求的URLkwargs为其他可选参数如headers、timeout等。 options(url, **kwargs): 发送OPTIONS请求url为请求的URLkwargs为其他可选参数如headers、timeout等。 request(method, url, **kwargs): 发送自定义请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 close(): 关闭httpx客户端。 request_stream(method, url, **kwargs): 发送流式请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 request_raw(method, url, **kwargs): 发送原始请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 request_bytes(method, url, **kwargs): 发送字节请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 request_json(method, url, **kwargs): 发送JSON请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 request_text(method, url, **kwargs): 发送文本请求method为请求方法url为请求的URLkwargs为其他可选参数如headers、timeout等。 request_files(method, url, filesNone, **kwargs): 发送文件请求method为请求方法url为请求的URLfiles为上传的文件kwargs为其他可选参数如headers、timeout等。 request_multipart(method, url, dataNone, filesNone, **kwargs): 发送多部分请求method为请求方法url为请求的URLdata为请求数据files为上传的文件kwargs为其他可选参数如headers、timeout等。 3.httpx上下文处理 在httpx中上下文处理是指在一个请求中将一些共同的参数或配置信息保存在一个上下文对象中以便在后续的请求中使用。这样可以避免在每个请求中都重复设置相同的参数或配置信息提高代码的可读性和可维护性。 httpx中的上下文对象是一个字典可以通过创建一个httpx.Context对象来获取。在创建Context对象时可以传入一些默认的参数或配置信息这些信息会被保存在Context对象中以便在后续的请求中使用。 下面是一些常用的httpx上下文处理方法 1.创建Context对象 import httpxcontext httpx.Context()2.设置默认的请求头 context.headers.update({User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 })3.设置代理 context.proxies {http: http://127.0.0.1:8888,https: http://127.0.0.1:8888 }4.设置超时时间 context.timeout httpx.Timeout(10.0, read20.0)5.设置SSL验证 context.verify False6.设置cookie context.cookies[name] value7.设置认证信息 context.auth httpx.BasicAuth(username, password)8.设置重试次数 context.retry httpx.Retry(total3, backoff_factor0.3)9.设置连接池 context.http2 True context.max_keepalive_connections 100 context.max_connections 10010.在请求中使用Context对象 import httpxcontext httpx.Context() context.headers.update({User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 })with httpx.Client(contextcontext) as client:response client.get(https://www.example.com)4.httpx异步请求 在进行网络请求时有时候需要进行异步请求以提高效率和性能。httpx是一个支持异步请求的Python HTTP客户端库可以使用async/await语法进行异步请求。 下面是一个使用httpx进行异步请求的示例 import httpx import asyncioasync def fetch(url):async with httpx.AsyncClient() as client:response await client.get(url)return response.textasync def main():urls [https://www.baidu.com,https://www.google.com,https://www.bing.com]tasks [asyncio.create_task(fetch(url)) for url in urls]results await asyncio.gather(*tasks)print(results)if __name__ __main__:asyncio.run(main())在上面的示例中我们定义了一个fetch函数用于异步请求指定的URL并返回响应内容。然后在main函数中我们定义了三个URL使用asyncio.create_task创建了三个异步任务并使用asyncio.gather等待所有任务完成并打印结果。 需要注意的是在使用httpx进行异步请求时需要使用AsyncClient类而不是普通的Client类。此外需要使用async/await语法进行异步请求。 2.数据解析 数据解析是爬虫工程师采集数据的重要环节它的目的是从爬取到的网页中提取出需要的数据。常用的数据解析方法有正则表达式、XPath、BeautifulSoup等。 其中正则表达式是一种强大的文本匹配工具可以用来匹配和提取文本中的特定模式。在爬虫中正则表达式通常用于匹配HTML标签中的内容例如匹配网页中的标题、链接、图片等。 正则表达式的基本语法包括字符集、量词、分组、反向引用等。例如要匹配一个HTML标签中的链接可以使用以下正则表达式 a\shref[]([^])[].*?其中\s表示匹配一个或多个空格[“]表示匹配单引号或双引号[^”]表示匹配除了单引号和双引号以外的任意字符.*?表示匹配任意字符但是尽可能少地匹配。 在使用正则表达式进行数据解析时需要注意以下几点 正则表达式的语法较为复杂需要仔细学习和理解。正则表达式的性能较差对于大规模数据解析可能会影响爬虫的效率。正则表达式只能匹配文本对于非文本数据如图片、视频等无法处理。 因此在实际爬虫开发中需要根据具体情况选择合适的数据解析方法。 一丶正则表达式 1.正则原理概述 在爬虫中数据解析是非常重要的一环因为数据解析模块的好坏将直接决定了爬虫的效率和准确度。正则表达式是数据解析中常用的一种技术下面就来简要介绍一下正则表达式的原理。 正则表达式Regular Expression即为正则或称规则表达式是一套用于描述、匹配和处理文本的符号规则。在爬虫中正则表达式常被用于从HTML文本中提取出我们需要的数据。正则表达式的语法非常强大包括字符集、元字符、量词、分组等许多特性能够满足各种复杂的匹配需求。下面简要介绍一些正则表达式的语法 字符集 字符集Character Classes也称字符组一般用方括号表示用于表示一组可选字符。比如[abc]表示可选任意一个字母a、b或c。其中还有一些常用的简写形式如\d表示任意一个数字等价于[0-9]\w表示任意一个字母、数字或下划线等价于[a-zA-Z0-9_]\s表示任意一个空白字符包括空格、制表符、回车符等。 元字符 元字符Metacharacters是正则表达式中具有特殊含义的字符如 \、^、$、*、、?、.、|、()、{m,n} 等等。这些字符在正则表达式中并非表示字面意义而是具有某种特殊的含义。 量词 量词用于指定字符或子表达式出现的次数常用的量词包括 *表示任意个字符包括零个字符表示至少一个字符?表示零个或一个字符{m}表示恰好出现 m 次{m,n}表示至少出现 m 次最多出现 n 次 分组 分组用小括号括起来用于将多个部分组合在一起。分组还允许应用量词即在一个组内表示一定数量的字符。 当然正则表达式也存在一些限制。由于正则表达式本身较为复杂容易出现逻辑上的错误在使用时需要注意。此外在处理海量数据时正则表达式的效率可能会成为影响程序性能的瓶颈。 综上所述正则表达式是数据解析中非常常用的一种技术掌握正则表达式的语法规则能够更方便地从HTML文本中提取出所需的数据。 2.分组和通用匹配 正则表达式是一种用于匹配文本的工具它可以用来解析HTML、XML等文本格式的数据。在正则表达式中分组和通用匹配是两个常用的概念。 1.分组 分组是指将正则表达式中的一部分用括号括起来形成一个子表达式。分组可以用来限定匹配范围、提取匹配结果等。 例如正则表达式(.?)中用括号括起来的部分就是分组第一个分组(.?)用来匹配链接地址第二个分组(.*?)用来匹配链接文本。 2.通用匹配 通用匹配是指用.来匹配任意字符的正则表达式。通用匹配可以用来匹配一些不确定的字符例如空格、换行符等。 例如正则表达式.*?中用.来匹配链接地址和链接文本中间的任意字符这样就可以匹配包含任意字符的链接了。 需要注意的是通用匹配可能会匹配到一些不需要的字符因此在使用时需要谨慎。 3.贪婪和非贪婪模式** 在爬虫工程师的采集工作中数据解析是非常重要的一环节。正则表达式是一种强大的工具可以用于从网页中提取有用的信息。在正则表达式中贪婪和非贪婪模式是一个关键的概念因为它们直接影响到正则表达式的匹配结果。 正则表达式中的贪婪模式指的是匹配尽可能多的字符而非贪婪模式则是匹配尽可能少的字符。默认情况下正则表达式是贪婪的这意味着它会尝试匹配尽可能多的字符。例如考虑以下正则表达式 .*hello.*该正则表达式将匹配任何字符串只要它包含子字符串“hello”。但是如果我们使用该正则表达式对以下字符串进行匹配 hello world! hello goup!结果将是整个字符串而不仅仅是第一个“hello”字符串。这是因为正则表达式会贪婪地匹配尽可能多的字符直到找到最后一个“hello”。 要使用非贪婪模式可以在正则表达式中使用“”符号。例如如果我们想要上面的正则表达式只匹配第一个“hello”可以这样写 .*?hello.*这个正则表达式将会匹配到第一个“hello”因为它使用了非贪婪模式尽可能少地匹配字符直到找到第一个“hello”。 总的来说在数据解析和爬虫采集过程中要根据需要选择合适的正则表达式模式。如果需要匹配尽可能多的字符则应该使用贪婪模式如果需要匹配尽可能少的字符则应该使用非贪婪模式。很多时候贪婪模式会导致意外的匹配结果因此需要特别小心。 4.findall/match/search方法 在Python中re模块提供了三种方法来匹配正则表达式findall、match和search。 findall方法 findall方法可以在字符串中查找所有匹配正则表达式的子串并返回一个列表。例如 import retext Hello, my name is John. My email is johnexample.com. emails re.findall(r\b\w\w\.\w\b, text) print(emails)输出结果为 [johnexample.com]match方法 match方法只能在字符串的开头匹配正则表达式如果匹配成功则返回一个匹配对象否则返回None。例如 import retext Hello, my name is John. My email is johnexample.com. match re.match(r\b\w\w\.\w\b, text) if match:print(match.group()) else:print(No match)输出结果为 No match因为正则表达式\b\w\w.\w\b只能匹配单词边界处的邮箱地址而字符串的开头不是单词边界。 search方法 search方法可以在字符串中查找第一个匹配正则表达式的子串并返回一个匹配对象否则返回None。例如 import retext Hello, my name is John. My email is johnexample.com. match re.search(r\b\w\w\.\w\b, text) if match:print(match.group()) else:print(No match)输出结果为 johnexample.com因为search方法会在整个字符串中查找匹配正则表达式的子串。 二丶xpath XPath是一种用于在XML文档中定位元素和属性的语言也可以用于HTML文档的解析。在PC端爬虫工程师采集数据时XPath可以帮助我们快速准确地定位到需要的数据。 XPath的语法比较简单主要由路径表达式和基本表达式组成。路径表达式用于定位元素基本表达式用于定位属性或文本。 以下是一些常用的XPath表达式 定位元素 //tagname选取所有名称为tagname的元素 /tagname选取根元素下的所有名称为tagname的元素 /path/tagname选取路径为path下的所有名称为tagname的元素 定位属性 //attribute选取所有名称为attribute的属性 /path/attribute选取路径为path下的所有名称为attribute的属性 定位文本 //tagname/text()选取所有名称为tagname的元素的文本内容 /path/tagname/text()选取路径为path下的所有名称为tagname的元素的文本内容 XPath的使用需要借助解析库比如Python中的lxml库。使用lxml库可以通过xpath()方法来解析HTML或XML文档获取需要的数据。 例如以下代码可以获取百度首页的搜索框的名称 import requests from lxml import etreeurl https://www.baidu.com/ response requests.get(url) html etree.HTML(response.text) input_name html.xpath(//input[idkw]/name)[0] print(input_name)输出结果为 wd这里使用了xpath表达式//input[idkw]/name来定位搜索框元素的名称属性。 1.dom节点 在使用XPath进行数据解析时需要了解DOM节点的概念。 DOMDocument Object Model是一种用于表示和操作HTML或XML文档的标准对象模型。在DOM中文档被表示为一个树形结构每个节点都是一个对象包含了文档中的元素、属性、文本等信息。 在XPath中每个节点都有一个节点类型常见的节点类型包括 元素节点Element Node表示XML或HTML文档中的元素如 、 等。 属性节点Attribute Node表示XML或HTML文档中的属性如class、id等。文本节点Text Node表示XML或HTML文档中的文本内容如 hello world 中的hello world。 在XPath中可以使用不同的语法来选择DOM节点常见的语法包括 路径表达式Path Expression使用路径表达式可以选择文档中的某个节点或一组节点。例如选择所有的 元素可以使用路径表达式//div。 轴Axis轴是一种用于选择节点的方法可以选择与当前节点有特定关系的节点。例如选择当前节点的所有子节点可以使用轴child::。谓语Predicate谓语是一种用于过滤节点的方法可以根据节点的属性或位置等信息来选择节点。例如选择第一个 元素可以使用路径表达式(//div)[1]。 掌握DOM节点的概念和XPath的语法可以更加灵活地进行数据解析。 2.xpath语法学习 XPathXML Path Language是一种用于在XML文档中定位元素和属性的语言。XPath使用路径表达式来选择和操作XML文档中的节点。 以下是XPath语法中的一些基本概念 节点XML文档中的元素、属性等都是节点。路径表达式一种用来表示选择某个节点或一组节点的字符串。路径路径指定从文档根节点到所选节点的方式可以是绝对路径或相对路径。谓语谓语用于筛选节点可以是一个表达式或条件。 XPath语法示例 选择节点 //book //表示从任意节点开始检索 /book /表示从根节点开始检索 book 表示选择名为book的节点选择属性 //class 选择所有名为class的属性谓语 //student[age20] 选择名为student且age大于20的节点 层级//bookstore/book/title 选择所有名为bookstore的节点下的名为book的节点下的名为title的节点XPath的语法非常直观容易理解和记忆。在使用XPath语法进行数据解析时可以使用Python中的lxml库来实现使用方法也非常简单。使用lxml库和XPath语法可以将HTML或XML文档中的数据提取出来并保存为结构化数据用于后续的分析和处理。 3.xpath定位文章数据 在使用XPath定位文章数据时需要先用浏览器开发者工具分析文章页面的HTML结构找出要提取的数据所在的节点然后使用XPath语法来筛选这些节点。 以下是一个示例假设我们要从一个博客的文章页面中提取文章标题、作者、发布时间和正文 htmlheadtitleBlog Title/title/headbodydiv classarticleh1 classtitleArticle Title/h1p classauthorAuthor Name/pp classpublish-time2023-06-09 20:08:20/pdiv classcontentpArticle Content Paragraph 1/ppArticle Content Paragraph 2/ppArticle Content Paragraph 3/p/div/div/body /html使用XPath语法可以定位到需要提取的节点 //h1[classtitle] # 定位到文章标题节点 //p[classauthor] # 定位到作者节点 //p[classpublish-time] # 定位到发布时间节点 //div[classcontent]/p # 定位到正文每一段的节点然后使用Python中的lxml库解析HTML提取出这些节点的文本内容 from lxml import etree# 解析HTML html etree.parse(article.html, etree.HTMLParser())# 提取节点文本 title html.xpath(//h1[classtitle]/text())[0] author html.xpath(//p[classauthor]/text())[0] publish_time html.xpath(//p[classpublish-time]/text())[0] content \n.join(html.xpath(//div[classcontent]/p/text()))这样就可以将文章的信息提取出来其中title、author和publish_time为字符串content为字符串列表每个元素为正文中的一段。后面可以根据需要将这些数据保存到文件或数据库中或者进行其他的数据处理。 三丶Beautiful 在进行网页数据解析时我们需要使用一些工具来帮助我们快速地定位和提取所需的数据。其中Beautiful Soup是一个非常常用的Python库它可以帮助我们解析HTML和XML文档并提供了一些方便的方法来定位和提取数据。 安装Beautiful Soup 在使用Beautiful Soup之前我们需要先安装它。可以使用pip命令来安装 pip install beautifulsoup4使用Beautiful Soup 安装完成后我们就可以开始使用Beautiful Soup了。下面是一个简单的例子演示了如何使用Beautiful Soup来解析HTML文档 from bs4 import BeautifulSouphtml_doc html headtitle这是一个示例页面/title /head bodyh1欢迎来到我的网站/h1p classcontent这是一个示例页面用于演示Beautiful Soup的使用方法。/pullia hrefhttp://www.example.com链接1/a/lilia hrefhttp://www.example.com链接2/a/lilia hrefhttp://www.example.com链接3/a/li/ul /body /html soup BeautifulSoup(html_doc, html.parser) print(soup.prettify())在这个例子中我们首先定义了一个HTML文档的字符串然后使用Beautiful Soup的构造函数来创建一个BeautifulSoup对象。构造函数的第二个参数指定了解析器的类型这里我们使用了Python内置的html.parser解析器。 接下来我们调用了BeautifulSoup对象的prettify()方法将解析后的HTML文档格式化输出。这个方法可以将HTML文档按照标准的缩进格式输出方便我们查看和调试。 定位元素 在使用Beautiful Soup解析HTML文档时我们通常需要定位文档中的某些元素然后提取它们的内容或属性。Beautiful Soup提供了一些方便的方法来定位元素下面是一些常用的方法 find()方法查找文档中第一个符合条件的元素。find_all()方法查找文档中所有符合条件的元素并返回一个列表。select()方法使用CSS选择器语法查找文档中符合条件的元素。 下面是一个例子演示了如何使用这些方法来定位元素 from bs4 import BeautifulSouphtml_doc html headtitle这是一个示例页面/title /head bodyh1欢迎来到我的网站/h1p classcontent这是一个示例页面用于演示Beautiful Soup的使用方法。/pullia hrefhttp://www.example.com链接1/a/lilia hrefhttp://www.example.com链接2/a/lilia hrefhttp://www.example.com链接3/a/li/ul /body /html soup BeautifulSoup(html_doc, html.parser)# 使用find()方法查找第一个符合条件的元素 title soup.find(title) print(title)# 使用find_all()方法查找所有符合条件的元素 links soup.find_all(a) for link in links:print(link)# 使用select()方法使用CSS选择器语法查找元素 content soup.select(.content) print(content)在这个例子中我们首先使用find()方法查找了文档中的第一个title元素并将其打印出来。接下来我们使用find_all()方法查找了所有的a元素并使用for循环将它们打印出来。最后我们使用select()方法使用CSS选择器语法查找了所有class为content的元素并将其打印出来。 提取内容和属性 在定位到元素后我们通常需要提取它们的内容或属性。Beautiful Soup提供了一些方便的方法来实现这个功能下面是一些常用的方法 text属性获取元素的文本内容。string属性获取元素的文本内容与text属性类似但是对于一些特殊的标签如script、style等会返回None。get()方法获取元素的指定属性值。 下面是一个例子演示了如何使用这些方法来提取内容和属性 from bs4 import BeautifulSouphtml_doc html headtitle这是一个示例页面/title /head bodyh1欢迎来到我的网站/h1p classcontent这是一个示例页面用于演示Beautiful Soup的使用方法。/pullia hrefhttp://www.example.com链接1/a/lilia hrefhttp://www.example.com链接2/a/lilia hrefhttp://www.example.com链接3/a/li/ul /body /html soup BeautifulSoup(html_doc, html.parser)# 获取元素的文本内容 title_text soup.title.text print(title_text)# 获取元素的指定属性值 link soup.find(a) link_href link.get(href) print(link_href)在这个例子中我们首先使用text属性获取了title元素的文本内容并将其打印出来。接下来我们使用find()方法查找了第一个a元素并使用get()方法获取了它的href属性值并将其打印出来。 总结 Beautiful Soup是一个非常常用的Python库它可以帮助我们解析HTML和XML文档并提供了一些方便的方法来定位和提取数据。在使用Beautiful Soup时我们通常需要使用find()、find_all()和select()等方法来定位元素然后使用text、string和get()等方法来提取内容和属性。 2.基于bs4的环境搭建 在使用BeautifulSoup之前需要先安装bs4库。可以使用pip命令安装 pip install bs4环境搭建完成后可以进行以下操作。 初始化BeautifulSoup对象 BeautifulSoup初始化时需要两个参数第一个参数是HTML或XML文档的字符串第二个参数是指定使用哪种解析器进行解析。常用的解析器包括html.parser、lxml和html5lib其中lxml解析器解析速度较快而html5lib解析器则能够处理一些语法非常松散的HTML文档。 以下是根据HTML文档初始化BeautifulSoup对象的代码 from bs4 import BeautifulSouphtml_doc html headtitle网页标题/title /head bodyh1 classtitle网页正文/h1div classcontentp第一段内容/pp第二段内容/pp第三段内容/pullia hrefhttp://www.example.com链接一/a/lilia hrefhttp://www.example.com链接二/a/lilia hrefhttp://www.example.com链接三/a/li/ul/div /body /htmlsoup BeautifulSoup(html_doc, html.parser) # 使用html.parser解析器初始化BeautifulSoup对象查找元素 使用BeautifulSoup中的find()和find_all()方法可以查找符合条件的元素。find()方法返回第一个符合条件的元素find_all()方法返回符合条件的所有元素。 以下是根据标签和属性查找元素的代码 # 查找所有p元素 ps soup.find_all(p) for p in ps:print(p.get_text())# 查找所有class属性值为content的元素 contents soup.find_all(class_content) for content in contents:print(content.get_text())提取元素属性 使用元素对象的attrs属性可以获取所有属性值使用get()方法可以获取某个特定属性值。 以下是根据属性提取元素的代码 # 获取所有a标签的href属性 a_s soup.find_all(a) for a in a_s:print(a[href])# 获取第一个a标签的href属性 a soup.find(a) print(a.get(href))使用CSS选择器 使用BeautifulSoup的select()方法可以通过CSS选择器查找元素。 以下是使用CSS选择器的代码 # 查找所有class属性值为content的div元素下的所有p元素 ps soup.select(.content p) for p in ps:print(p.get_text())# 查找第一个ul元素下的所有li元素 lis soup.select(ul li) for li in lis:print(li.get_text())BeautifulSoup提供了许多方法可以方便地操作HTML和XML文档具体使用可以参照官方文档进行。 3.bs4节点选择器 在使用BeautifulSoup解析HTML代码时通过节点选择器可以选择HTML文档中的指定部分常用的节点选择器包括标签选择器、类选择器、id选择器、属性选择器等。 标签选择器 标签选择器是最常用的选择器它根据HTML标签名称来选择HTML文档中的元素。可以使用find()或find_all()方法来实现标签选择器。 # 选择第一个p标签 soup.find(p)# 选择所有p标签 soup.find_all(p)类选择器 类选择器是通过元素的class属性进行选择可以使用CSS选择器语法来选择单个或多个类。 # 选择class为foo的元素 soup.select(.foo)# 选择同时具有class为foo和bar的元素 soup.select(.foo.bar)id选择器 id选择器是根据id属性进行选择可以使用CSS选择器语法选择具有指定id的元素。可以使用find()方法来实现id选择器。 # 选择id为myid的元素 soup.find(idmyid)属性选择器 属性选择器是根据元素的属性值来选择元素。可以使用find_all()方法和属性名选择单个或多个元素。 # 选择所有具有href属性的a标签 soup.find_all(a, hrefTrue)子选择器 子选择器是通过选择器名称的空格分隔符来实现选择父元素下的子元素。 # 选择div元素下的所有p元素 soup.select(div p)后代选择器 后代选择器使用选择器名称的大于号分隔符来实现选择某个父元素下的直接子元素。 # 选择div元素下的直接子元素p元素 soup.select(div p)兄弟选择器 兄弟选择器是指选择与指定元素处于同一层级但不一定是相邻的元素。可以使用选择器名称的符号选择下一个兄弟元素使用选择器名称的~符号选择所有兄弟元素。 # 选择id为foo元素的下一个兄弟元素 soup.select(#foo p)# 选择id为foo元素的所有兄弟元素 soup.select(#foo ~ p)以上就是使用BeautifulSoup的节点选择器的常用方法基于选择器的使用可以解析和提取HTML文档中的各种元素和属性信息。 4.bs4属性选择器 在Beautiful Soup中我们可以使用属性选择器来选择具有特定属性的标签。属性选择器使用方括号[]来指定属性名称和属性值。 以下是一些常用的属性选择器 选择具有特定属性的标签 soup.select(tag[attr])例如选择所有具有class属性的div标签 soup.select(div[class])选择具有特定属性和属性值的标签 soup.select(tag[attrvalue])例如选择所有class属性为example的div标签 soup.select(div[classexample])选择具有特定属性但不限制属性值的标签 soup.select(tag[attr*])例如选择所有具有id属性的标签 soup.select([id*])选择具有特定属性值的标签但不限制属性名称 soup.select([*value])例如选择所有属性值包含example的标签 soup.select([*example])选择具有多个属性的标签 soup.select(tag[attr1][attr2])例如选择所有同时具有class属性为example和id属性为test的div标签 soup.select(div[classexample][idtest])5.bs4层级选择器 BeautifulSoup库提供了一些层级选择器可以用于选择HTML文档中的指定层级元素。层级选择器可以嵌套使用以实现更精细的元素选择。 以下是bs4层级选择器的几个常见方法 descendants选择器 该选择器用于选择当前元素的所有后代元素包括子元素、子元素的子元素、子元素的子元素的子元素等。使用descendants方法进行查找返回所有后代元素的生成器对象。 # 选择id为content的div元素的所有后代元素 for elem in soup.find(div, idcontent).descendants:print(elem)children选择器 该选择器用于选择当前元素的所有子元素不包括子元素的子元素。使用children方法进行查找返回当前元素的所有子元素的生成器对象。 # 选择id为content的div元素的所有子元素 for elem in soup.find(div, idcontent).children:print(elem)parent选择器 该选择器用于选择当前元素的父元素使用parent方法进行查找返回当前元素的父元素。 # 选择id为myid的元素的父元素 parent soup.find(idmyid).parentparents选择器 该选择器用于选择当前元素的所有祖先元素返回一个生成器对象。与descendants方法不同该方法只返回直接祖先元素不包括更远的祖先元素。 # 选择id为myid的元素的所有祖先元素 for ancestor in soup.find(idmyid).parents:print(ancestor)next_sibling和previous_sibling选择器 next_sibling选择器用于选择当前元素的下一个兄弟元素previous_sibling选择器用于选择当前元素的上一个兄弟元素。 # 选择id为myid的元素的下一个兄弟元素 next_sibling soup.find(idmyid).next_sibling以上就是bs4层级选择器的常见方法这些方法可以很好地帮助我们选择HTML文档中的特定元素来进行后续的数据提取和处理。 3.数据入库 前言 数据入库是指将采集好的数据存储到数据库中以便后续处理和分析。作为一名PC端爬虫工程师掌握数据入库技能是必不可少的。在进行数据采集的同时将数据实时地存储到数据库中可以让数据得到更好地管理和利用提高效率和效益。 一般而言进行数据入库有以下几个步骤 数据库的创建和配置选择一个合适的数据库根据实际需要创建数据库表和配置数据库连接等参数。 数据库连接建立数据库与Python的连接。有关Python连接数据库的方法有很多种比如通过Python自带的SQLite数据库模块、通过MySQL Connector等第三方库进行连接。 数据准备和清洗在进行数据入库之前需要进行针对性的数据准备和清洗工作。比如对采集到的数据进行初步处理处理掉无意义的数据将有用的数据组织好。 数据的插入和更新通过Python提供的数据库操作工具如SQLAlchemy或sql语句来进行数据的插入和更新操作。 数据库的维护包括对数据库表的清理、优化和备份等操作以确保数据库的稳定运行。 需要注意的是数据库入库不仅涉及到数据库本身的知识还需要对Python编程语言有一定的掌握。因此PC端爬虫工程师在进行数据入库之前需要先掌握Python的基础语法熟练掌握Python的相关技巧才能顺利地进行数据采集和入库工作。 总而言之数据入库是PC端爬虫工程师不可或缺的一项技能。只有掌握好数据入库技能才能为企业或个人实现更好地数据分析和应用提高数据价值。 一丶MySQL MySQL是一种常用的关系型数据库管理系统广泛应用于各种应用场景。在进行数据采集和入库工作时掌握MySQL数据库的使用是极为重要的。 1.MySQL表结构设计 MySQL表结构设计是进行数据入库时需要考虑的一个重要问题。一个好的表结构设计可以保证数据的存储和管理更加高效和便捷。以下是几个关键点供PC端爬虫工程师在进行MySQL表结构设计时参考 字段设定在表结构设计中需要设定字段和对应的数据类型。字段的设定需考虑数据的类型、长度、是否允许为空、是否唯一、是否自增等因素。在设计字段时需遵循最小化原则避免不必要的字段以减轻数据库处理压力。 主键、唯一键、索引等设定通过索引可以提高查询的效率因此在数据入库时应该考虑添加索引。一般而言需要给表中的字段设定主键、唯一键和普通索引等以优化数据的查询性能。 表的级联关系在设计表结构时需要考虑多表之间的关系。比如是采用多个独立的表还是将其合并为一个复杂的表。还需考虑多表之间的级联关系以确保数据的一致性。 设定数据表的字符集和排序规则在MySQL表的结构设计中还需考虑字符集和排序规则的设定。要根据实际情况选择合适的字符集和排序规则以避免数据存储时出现乱码或者排序问题。 2.MySQL数据写入规范 MySQL数据写入规范是进行数据入库时需要考虑的一个重要问题。一个良好的数据写入规范可以保证数据的准确性和一致性确保数据在数据库中的正确存储。以下是PC端爬虫工程师需要遵循的MySQL数据写入规范 字段值格式与表结构匹配在进行数据写入时需要确保字段值的格式与表结构匹配。即使数据库允许数据随意写入也应该遵循表结构设计的原则将数据写入到正确的字段中。 数据的完整性在进行数据写入时需要确保数据的完整性。应尽量避免数据缺失、重复或者错误等问题以免对后续分析和应用造成影响。 数据的规范化对于涉及字符串、日期等数据类型的字段需要考虑到数据的规范化。比如对于日期数据应统一使用一种日期格式并避免使用默认格式等导致的问题。 事务管理在进行数据写入时应尽量使用事务来确保数据的一致性。比如在写入多条记录时可以将它们一起写入到数据库中并在最后再统一提交以确保数据在写入的过程中保持一致性。 避免超限数据的写入在进行数据写入时应严格避免超限数据的写入例如数据长度超出字段长度等问题。如果数据超限会导致数据丢失或者数据库撑爆等问题。 3.MySQL动态传参 MySQL动态传参是进行数据入库时经常用到的一种技巧。通过动态传参可以有效地提高MySQL数据库写入的效率减少程序代码的冗余优化数据入库过程。以下是几种常用的MySQL动态传参方式 使用Python的字符串格式化方法进行动态传参可以使用Python的字符串的format方法进行MySQL参数的传递。在进行数据写入操作时可以将MySQL语句和Python字典或元组进行结合实现动态传参的效果。例如 import MySQLdb# 定义数据表名 table_name student# 定义学生信息 student_info {name: Tom,age: 18,grade: A }# 动态传参 sql INSERT INTO {table_name} (name, age, grade) VALUES ({name}, {age}, {grade}).format(table_nametable_name,namestudent_info[name],agestudent_info[age],gradestudent_info[grade] )# 连接数据库 conn MySQLdb.connect(localhost, username, password, database_name) # 获取游标对象 cursor conn.cursor() # 执行操作 cursor.execute(sql) # 提交事务 conn.commit() # 关闭游标和连接 cursor.close() conn.close()使用MySQLdb模块的execute方法进行动态传参使用MySQLdb的execute方法进行动态传参只需要在SQL语句中使用占位符%s然后在执行execute方法时传递参数列表即可。例如 import MySQLdb# 定义数据表名 table_name student# 定义学生信息 student_info {name: Tom,age: 18,grade: A }# 动态传参 sql INSERT INTO {table_name} (name, age, grade) VALUES (%s, %s, %s).format(table_nametable_name )# 连接数据库 conn MySQLdb.connect(localhost, username, password, database_name) # 获取游标对象 cursor conn.cursor() # 执行操作 cursor.execute(sql, (student_info[name], student_info[age], student_info[grade])) # 提交事务 conn.commit() # 关闭游标和连接 cursor.close() conn.close()总之MySQL动态传参是进行数据入库时经常使用的一种技巧。PC端爬虫工程师掌握MySQL动态传参的使用方法可以对SQL语句进行动态的参数传递从而提高数据库写入的效率、减少代码冗余。在进行数据入库时建议使用MySQL动态传参技巧以提高数据的写入效率和准确性。 4.MySQL对接爬虫实战 在进行爬虫数据采集和入库时MySQL是一个常用的关系型数据库管理系统其稳定性和可靠性被广泛认可。以下是PC端爬虫工程师可以按照的步骤将爬虫采集数据写入到MySQL数据库中 创建MySQL数据库表结构在MySQL数据库中创建一个数据表该表的表结构应根据数据的类型和存储需求进行设计。在表结构设计时需要考虑字段设定、主键、唯一键、索引等因素。 使用Python中的爬虫框架进行数据采集使用Python中的Scrapy或者BeautifulSoup等常用的PC端爬虫框架进行数据采集将采集到的数据存储在Python的变量中。 连接MySQL数据库使用Python的MySQLdb或pymysql等第三方库连接MySQL数据库并进行相应的参数配置。 实现数据写入操作使用Python的cursor对象通过sql语句将数据插入到MySQL数据库中。在插入数据时需要遵循MySQL数据库的数据写入规范保证数据的完整性、一致性和安全性。如果需要动态传参在插入数据时还需要用到字符串格式化方法或者MySQLdb的execute方法进行动态传参。 关闭数据库连接当完成数据入库操作后应及时关闭数据库连接以释放资源。 下面是一个将采集到的数据写入MySQL数据库的示例代码 import MySQLdb# 连接MySQL数据库 conn MySQLdb.connect(localhost, username, password, database_name)# 获取游标对象 cursor conn.cursor()# 采集到的数据 book {name: Python入门精通, author: 张三, price: 28}# 数据库写入操作 sql INSERT INTO books (name, author, price) VALUES (%s, %s, %f) % (book[name], book[author], book[price]) try:# 执行SQL语句cursor.execute(sql)# 提交事务conn.commit() except Exception as e:# 发生异常时回滚print(str(e))conn.rollback()# 关闭游标和连接 cursor.close() conn.close()将爬虫采集的数据写入MySQL数据库是PC端爬虫工程师需要掌握的重要技能之一。需要合理设计数据表结构使用Python的爬虫框架进行数据采集正确连接MySQL数据库遵循MySQL的数据写入规范进行数据写入操作并严格保障数据的完整性和一致性。 二丶MongoDB 除了关系型数据库MySQL另一种非常流行的数据库是NoSQL数据库MongoDB。相比于MySQLMongoDB具备更好的可扩展性和更方便的数据处理方式是现代Web应用程序的热门选择。以下是将爬虫采集数据写入MongoDB数据库的步骤 安装MongoDB数据库在开始使用MongoDB数据库之前需要安装MongoDB以及相应的Python驱动程序pymongo。MongoDB官网提供了各种安装方式和文档。 连接MongoDB数据库使用pymongo库连接MongoDB数据库并进行相应的参数配置。MongoDB需要指定数据库所在服务器地址、端口号、数据库名称等连接信息。 创建MongoDB数据库和集合MongoDB是面向文档的数据库不需要像MySQL一样设计表结构而是直接存储JSON格式的文档。可以首先创建MongoDB数据库和集合然后在代码中直接插入文档。使用pymongo库提供的MongoClient对象可以连接MongoDB数据库并使用相应的方法创建数据库和集合等。 实现数据写入操作使用pymongo库提供的insert_one或insert_many等方法将Python变量中的数据插入到MongoDB中。在插入数据时需要遵循MongoDB的数据写入规范保证数据的完整性、一致性和安全性。如果需要动态传参在插入数据时还需要用到Python格式化字符串或bson模块的tobson方法。 关闭数据库连接当完成数据入库操作后应及时关闭数据库连接以释放资源。 下面是一个将采集到的数据写入MongoDB数据库的示例代码 import pymongo import json# 连接MongoDB数据库 client pymongo.MongoClient(hostlocalhost, port27017)# 创建MongoDB数据库和集合 db client[bookstore] collection db[books]# 采集到的数据 book {name: Python入门精通, author: 张三, price: 28}# 数据库写入操作 try:# 将Python字典转换为MongoDB的文档格式doc json.loads(json.dumps(book))# 插入文档到MongoDBcollection.insert_one(doc) except Exception as e:print(str(e))# 关闭MongoDB连接 client.close()将爬虫采集的数据写入MongoDB数据库是PC端爬虫工程师需要掌握的另一个重要技能。需要首先安装MongoDB数据库和Python驱动程序pymongo然后使用pymongo库连接MongoDB数据库创建数据库和集合使用insert_one和insert_many等方法将数据插入到MongoDB中。同时也需要遵循MongoDB的数据写入规范保障数据的完整性和一致性。 1.MongoDB数据写入规范 MongoDB是一种非关系型数据库相对于传统关系型数据库MySQL它有许多的特性和优势但是在使用时需要遵守一定的数据写入规范以保证数据的安全性和一致性。下面是在将数据写入MongoDB时需要遵守的规范 字段命名规范MongoDB支持使用Unicode字符集中的所有字符作为字段名称但是不推荐使用除字母数字和下划线以外的特殊字符且建议使用小写字母。字段名称不能为空字符串并且不能以$开头。 数据格式规范在将数据写入MongoDB中时需要保证文档中每个字段的数据类型和数据格式的一致性。如果想要将Python中的数据写入MongoDB可以先将Python中的数据格式化为JSON字符串或字典然后再将其转换为MongoDB文档格式。 文档唯一性规范MongoDB中的每个文档都应该具有唯一的_id字段。如果在写入文档时没有指定_id字段则MongoDB会为每个文档自动生成一个ObjectId类型的_id字段。 数据写入确认规范当使用MongoDB写入数据时应该使用写入确认来确保数据已经成功写入数据库。MongoDB提供了四种写入确认级别分别为未确认写入、确认主节点写入、确认大多数节点写入和确认所有节点写入。 数据更新规范在更新MongoDB中的文档时可以使用update方法进行更新。使用update方法时需要指定更新的文档、更新的方式和更新的条件。如果不指定更新条件则默认会更新所有符合条件的文档。更新操作还可以将某个字段的值进行递增或递减操作。 数据删除规范在MongoDB中删除文档时可以使用remove方法进行删除。使用remove方法时需要指定删除的文档和删除的条件。如果不指定条件则默认会删除所有文档。 在将数据写入MongoDB中时需要遵守一定的规范以保证数据的安全性和一致性。需要注意字段命名规范、数据格式规范、文档唯一性规范、数据写入确认规范、数据更新规范和数据删除规范。 2.MongoDB数据异常处理 在进行数据入库到MongoDB的过程中可能会遇到一些异常情况例如写入数据失败、查询数据出错等等。为了保证数据的完整性和正确性需要进行一些异常处理。 以下是在使用MongoDB进行数据入库时可能会遇到的异常情况及相应的处理方法 写入数据失败在将数据写入MongoDB的过程中可能会由于网络问题、数据库连接失败或者其他原因导致写入失败。此时需要进行重试操作并且可以使用MongoDB提供的异常处理机制来捕获异常并进行相应的处理。 查询数据出错在查询MongoDB中的文档时可能会由于查询条件错误、查询字段不存在或其他原因导致查询出错。此时可以使用MongoDB提供的异常处理机制来捕获异常并进行相应的处理。 数据库连接失败在连接MongoDB数据库时可能会由于网络问题、数据库服务未启动或其他原因导致连接失败。此时需要检查数据库服务是否正常运行并重新连接数据库。 数据库连接断开在MongoDB与客户端进行通信时可能会由于网络问题或者其他原因导致连接断开。此时需要重新连接MongoDB数据库并处理异常情况。 数据库写锁在进行写入操作时可能会由于另一个线程正在写入同一个文档而出现写入锁。此时需要等待写入锁释放然后再进行操作。 数据库读锁在进行读取操作时可能会由于另一个线程正在更新同一个文档而出现读取锁。此时可以选择等待读取锁释放或者强制获取读取锁进行读取操作。 在进行数据入库到MongoDB的过程中可能会遇到各种异常情况需要注意异常处理以保证数据的完整性和正确性。需要使用MongoDB提供的异常处理机制对可能出现的异常进行捕获并进行相应的处理。此外还需要注意在进行写入操作时可能出现的写锁以及在进行读取操作时可能出现的读锁。 3.爬虫对接MongoDB实战操作 在进行爬虫数据采集时将采集到的数据存储到MongoDB数据库中是一个比较常见的操作。下面简单介绍一下如何使用Python爬虫程序对接MongoDB数据库进行实战操作。 安装MongoDB驱动程序Python爬虫程序可以使用第三方库–pymongo–来操作MongoDB数据库。首先需要安装pymongo库可以使用pip命令进行安装 pip install pymongo连接MongoDB数据库使用pymongo库连接MongoDB数据库非常简单。需要指定MongoDB服务器的IP地址及端口号同时指定要使用的数据库名称和集合名称。示例代码如下 import pymongo# 连接MongoDB服务器 client pymongo.MongoClient(mongodb://localhost:27017/)# 选择数据库和集合 db client[testdb] col db[testcol]在实际操作中可以根据需要自己定义数据库和集合的名称。 插入数据到MongoDB将爬虫采集到的数据插入到MongoDB中需要使用pymongo库提供的insert_one()或insert_many()方法。如果要插入多条数据可以使用insert_many()方法。示例代码如下 import pymongo# 连接MongoDB服务器 client pymongo.MongoClient(mongodb://localhost:27017/)# 选择数据库和集合 db client[testdb] col db[testcol]# 插入一条数据 data {title: Python编程, price: 88.8} col.insert_one(data)# 插入多条数据 datas [{title: Java编程, price: 99.9},{title: C编程, price: 79.9},{title: PHP编程, price: 69.9}, ] col.insert_many(datas)查询数据查询MongoDB数据库中的数据需要使用pymongo库提供的find()方法。可以根据需要指定查询条件和查询字段。示例代码如下 import pymongo# 连接MongoDB服务器 client pymongo.MongoClient(mongodb://localhost:27017/)# 选择数据库和集合 db client[testdb] col db[testcol]# 查询数据 data col.find_one({title: Python编程}) print(data)for data in col.find():print(data)更新数据和删除数据使用pymongo库提供的update_one()、update_many()、delete_one()和delete_many()方法可以更新和删除MongoDB数据库中的数据。 import pymongo# 连接MongoDB服务器 client pymongo.MongoClient(mongodb://localhost:27017/)# 选择数据库和集合 db client[testdb] col db[testcol]# 更新数据 query {title: Python编程} new_data {$set: {price: 99.99}} result col.update_one(query, new_data) print(result.modified_count)# 删除数据 query {title: Python编程} result col.delete_one(query) print(result.deleted_count)以上就是对接MongoDB数据库的实战操作。需要注意的是MongoDB数据库在进行大量写入数据时可能会遇到性能瓶颈问题可以通过使用分片和索引等技术来提高MongoDB数据库的性能。 三丶JSON 进行数据采集时一种常见的数据存储格式是JSONJavaScript Object Notation。JSON格式具有轻量级、结构化等优点且易于使用和解析。下面介绍PC端爬虫工程师采集数据后如何将数据存储为JSON格式。 使用Python标准库json将数据转换为JSON格式 Python标准库json提供了loads(),load(),dumps()和dump()四个函数用于JSON数据的解析和编码。其中dump()函数可以将Python对象直接序列化为JSON文件如下使用示例 import jsondata {name: Tom,age: 18,gender: male }with open(data.json, w) as f:json.dump(data, f)使用Python第三方库pandas将数据存储为JSON格式 pandas是一种基于NumPy的数据分析工具支持多种数据格式的解析、操作和存储其中就包括JSON格式。pandas提供了to_json()方法可以将DataFrame对象、Series对象或Python字典对象存储为JSON格式文件。示例如下 import pandas as pddata pd.DataFrame({name: [Tom, Jack, Lucy],age: [18, 19, 20],gender: [male, male, female] })data.to_json(data.json)使用Python第三方库scrapy将数据存储为JSON格式 scrapy是一种广泛应用于Web爬虫数据采集的Python框架它默认支持多种数据存储方式包括JSON格式。在使用scrapy框架进行数据采集时可以将数据存储为JSON格式示例代码如下 import scrapyclass MySpider(scrapy.Spider):name example.comstart_urls [http://www.example.com]def parse(self, response):# 爬虫采集到的数据data {name: Tom,age: 18,gender: male}# 将数据存储为JSON格式yield data进行数据采集时可以选择将采集到的数据存储为JSON格式。可以使用Python标准库json、第三方库pandas或爬虫框架scrapy提供的方法将数据以JSON格式存储起来以达到方便解析和处理的效果。 1.JSON对象和数组 JSON对象 JSON对象是由花括号“{}”包围的一组属性-值对。属性和值之间使用冒号“:”分隔不同属性之间使用逗号“,”分隔。一个JSON对象可以包含零到多个属性-值对示例如下 {name: Tom,age: 18,gender: male,hobbies: [reading, traveling] }其中name、age、gender是属性对应的值分别是Tom、18、malehobbies是一个数组包含两个元素reading和traveling。 JSON数组 JSON数组是由方括号“[]”包围的一组值不同值之间使用逗号“,”分隔。一个JSON数组可以包含零到多个值示例如下 [{name: Tom, age: 18, gender: male},{name: Jack, age: 19, gender: male},{name: Lucy, age: 20, gender: female} ]这是一个包含三个JSON对象的数组每个对象都包括name、age、gender三个属性分别表示姓名、年龄、性别。 使用JSON对象和JSON数组可以灵活地组织和存储数据。在进行数据采集和数据处理时PC端爬虫工程师需要了解和掌握这两种JSON结构的相关知识以便更好地将采集到的数据存储为JSON格式进行数据解析和处理等操作。 2.JSON数据编码 进行数据采集和数据存储时需要将采集到的数据编码为JSON格式以便后续进行解析和处理等操作。在Python语言中使用json模块可以方便地进行JSON数据编码。 具体操作如下 导入json模块 import json将Python数据类型转换为JSON格式 使用json.dump()方法将Python数据类型如字典、列表转换为JSON格式并存储到指定文件中。语法如下 json.dump(obj, fp, *, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, defaultNone, sort_keysFalse, **kw)其中参数obj为Python数据类型参数f为文件路径。 代码示例 import jsondata {name: Tom, age: 18, gender: male}with open(data.json, w) as f:json.dump(data, f)运行代码后会在当前工作目录中生成一个data.json文件文件内容为转换后的JSON格式数据 {name: Tom, age: 18, gender: male}将Python数据类型转换为JSON格式返回JSON字符串 使用json.dumps()方法将Python数据类型如字典、列表转换为JSON格式并返回一个对应的JSON字符串。语法如下 json.dumps(obj, *, skipkeysFalse, ensure_asciiTrue, check_circularTrue, allow_nanTrue, clsNone, indentNone, separatorsNone, defaultNone, sort_keysFalse, **kw)其中参数obj为Python数据类型。 代码示例 import jsondata {name: Tom, age: 18, gender: male}json_str json.dumps(data)print(json_str)运行代码后控制台会输出转换后的JSON格式字符串 {name: Tom, age: 18, gender: male}可以根据实际情况选择使用json.dump()或json.dumps()进行JSON数据编码以便将采集到的数据存储为JSON格式方便后续的数据处理和解析等操作。 适用于零基础学习和进阶人群的python资源 ① 腾讯认证python完整项目实战教程笔记PDF ② 十几个大厂python面试专题PDF ③ python全套视频教程零基础-高级进阶JS逆向 ④ 百个项目实战源码笔记 ⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目文档
http://www.laogonggong.com/news/120441.html

相关文章:

  • 简述网站开发的几个步骤品牌建设指标考核
  • 最新网站制作公司哪个好网站开发设计的技术
  • 昆明建设银行纪念币预约网站牙科医院网站推广方案
  • 网站速度怎么提升wordpress头像缓存插件
  • 常州设计网站wordpress 蜜蜂采集
  • 单位建设网站的请示wordpress post函数
  • 新闻类的网站如何做优化广告标识标牌制作公司
  • 广西住房和城乡建设厅网站证件网站注册页面怎么做数据验证码
  • 关于建设网站的申请报告mvc net跳转到另一网站
  • iis7.5添加网站php ajax网站开发
  • 住房城乡建设部官方网站蘑菇街网站模板
  • 做h网站关键词优化排名用哪个软件比较好
  • 网站开发 文献综述织梦做的网站首页排版错误
  • 榆林电商网站建设英德建设局网站
  • 合肥学网站设计如何用两台电脑做服务器建网站
  • 网站开发 足球球队信息贴心的网站优化公司
  • 扬州网站建设公司搞笑资讯网站源码
  • 什么网站免费制作如今做哪个网站能致富
  • 网站如何做即时聊天网站制作企业对比
  • 汉爱手表官方网站域名租用平台
  • 理卖做各视频网站的会员网站建设数据库类型
  • 中国建设电工网站查看网站速度
  • 红动中国免费素材网站全国各城市感染高峰期进度
  • 网站带后台模板网站域名如何起
  • WordPress多站点默认设置模板网站可以做推广吗
  • 自助建站的软件实体店引流推广方法
  • 网站建设域名有哪些类型做网站用什么语言开发
  • 自己建一个影视网站要怎么做北京智能模板建站
  • 快速搭建外贸网站国产网站开发工具公司
  • 做和别人一样的网站网站系统建设招标文件