爬虫学习心得

爬虫学习心得

  • 下面给新学者分享一些爬虫的技巧
    • 1 xpath的学习
      • a xpath的基本用法
      • b xpath案例
    • 2.正则表达式学习
      • a 基本使用
      • b 12306提取省份成json格式
    • 3.Bs的学习
      • 3.1基础
      • 3.3基础案例
      • 3.5基本案例
    • 4.拿取数据技巧
      • 4.1通过标签获取
      • 4.2通过lamda表达式获取数据

下面给新学者分享一些爬虫的技巧

1 xpath的学习

	xpath为用的最广,也是最好用的,不过比较吃性能。

a xpath的基本用法

from lxml import etree
from lxml import html
etree=html. etree
#需要加载准备解析的数据
f=open("test.html",modle="r",encoding='utf-8')
pageSource = f.read()
#加载数据,返回element对象
et=etree.HTML(pageSource)
#xpath的语法
result =et.xpath('/html')#/html表示根节
result = et.xpath('/html/body')#表达式中间的/表示一层html节点
result= et.xpath('/html/body/span')
result =et.xpath('/html/body/span/text()')#获取span中的文字
#text()表示提取标签中的文本信息
result = et.xpath('/html/body/*/l/a/text()')
#*任意的.通配符
result =et.xpath('/htmi/body/*/li/a/@href')#@表示属性
result =et.xpath("//li/a/@href")#/表示任意位置
result=et.xpath('/div[@class=job]/text()') #[@xx=xxxx]属性的限定
print(result)
#带循环的
result= et.xpath('/html/body/ul/li')
for item in result:href= item.xpath("./a/@href")[0]#./表示当前这个元素text =item.xpath("./a/text()")[0]#./表示当前这个元素print(text, href)

b xpath案例

import requests
import re
import os
import json
from lxml import etree
from lxml import etree
url = "xxx"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
try:response = requests.get(url=url,headers=headers)# 设置编码为和父类一样response.encoding =response.apparent_encodingprint(response.text)et = etree.HTML(response.text)#xpath匹配results = et.xpath(f'//*[@id="J-lemma-main-wrapper"]/div[2]/div/div[1]/div/*/*/*/dd/span/text()')print(results)
except:print("errrro")

2.正则表达式学习

a 基本使用

import re
result=re.search(r'\d+','今天我有100块,买了两个蛋糕')#返回match对象
print(result.group())result=re.finditer(r'\d+','今天我有100块,买了两个蛋糕')#返回的是迭代器
print(result)
for item in result:print(item.group())
#预加载
obj=re.compile(r'\d+')
result=obj.findall('今天我有100块,买了两个蛋糕')
print(result)match="divorce 分歧;diverse 各色各样;diversify 使多样化;divert 转入;divest 脱去;divorce 分开; divulge 泄露"
pattern=".*?&nbsp(.*?);"
match_1=re.search(pattern,match)
print(match_1.group())

b 12306提取省份成json格式

import requests
import re
url = "https://kyfw.12306.cn/otn/resources/js/framework/favorite_name.js"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
response.encoding =response.apparent_encoding
parr = re.compile(r"@.*?\|(.*?)\|(.*?)\|")
images = re.findall(parr,response.text)
len1=len(images)
print(response.text)
data={}
json_file = open('data.json', 'w+', encoding='UTF-8',newline='')
json_file.write("{")
json_file.write('\n')
for image in images:# print(image[0],end='')# print(image[1])name=image[0]id=image[1]json_file.write(f"\"{name}\":\"{id}\"")if name!=images[len1-1][0]:json_file.write(",")json_file.write("\n")
json_file.write('\n')
json_file.write("}")

3.Bs的学习

3.1基础

from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen('xxx.html')
bs=BeautifulSoup(html, 'html.parser')
# data=bs.select('li a[href="news/index.html"]')
# data=bs.select('title')
# print(data)
#1.通过标签名查找
data=bs.select('title')[0].get_text()
print('通过标签名查找:'+data)
print('----------'*30)
#2.通过类名查找
data1=bs.select('.infoPath a')[0].get_text()
print('通过类名查找:'+data1)
print('----------'*30)
#3.通过id名查找
data2=bs.select('#header_login_user a')[0].get_text()
print('通过id名查找:'+data2)
print('----------'*30)
#4.组合查找
data3=bs.select('.readAreaBox.content h1')[0].get_text()
print('通过组合查找查找:'+data3)
print('----------'*30)
#5.属性查找
data3=bs.select('div a[href="/man"]')[0].get_text()
print('通过属性查找查找:'+data3)

###3.2基础案例

import requests
from bs4 import BeautifulSoup
class Content:def __init__(self, url, title, body):self.url = urlself.title = titleself.body = body
def getPage(url):html = requests.get(url)return BeautifulSoup(html.content, 'html.parser')
def scrapeNew(url):#小说bs =getPage(url)title = bs.find('h1').textbody = bs.select('#readArea > div.readAreaBox.content > div.p')[0].textreturn Content(url, title, body)
def scrapeNew1(url):#故事大全bs=getPage(url)title = bs.find('h1').text# print(title)# body=bs.select('#newsnr p')body=bs.find('div',class_='article_content').text# body=''.join(body)return Content(url,title,body)def scrapeNew2(url):#新浪新闻bs=getPage(url)title = bs.find('h1').textprint(title)body=bs.find('div',class_='article').textreturn Content(url,title,body)
url= 'xxxx'content = scrapeNew(url)
print('Title:{}'.format(content.title))
print('URL:{}'.format(content.url))
print('body:{}'.format(content.body))
print("-" * 130)
url='xxxx'content=scrapeNew1(url)
print('Title:{}'.format(content.title))
print('URL:{}' .format(content.url))
print('body:{}'.format(content.body))
print("-" * 130)
url='xxxx'content=scrapeNew2(url)
print('Title:{}'.format(content.title))
print('URL:{}' .format(content.url))
print('body:{}'.format(content.body))

3.3基础案例

import requests
from bs4 import BeautifulSoup
class Content:def __init__(self, topic, url, title, body):self.topic=topicself.url=urlself.title=titleself.body=bodydef print(self):print("找到的相关关键字的文章:{}".format(self.topic))print("网站:{}".format (self.url))print("标题:{}".format (self.title))print("内容:{}".format (self.body))
class Website:def __init__(self, name, url, searchUrl, resultListing, resultUrl, absoluteUrl, titleTag, bodyTag):self.name=name#网站名self.urL=url#网站网址self.searchUrl=searchUrl#关键词的总界面self.resultListing=resultListing#存放每个信息的盒子,即每个结果链接的上层标签,例如diself.resultUrl=resultUrl#更细致的定位准确的URL,如div.result h3 aself.absoluteUrl=absoluteUrl#一个布尔值,判断绝对相对链接self.titleTag=titleTag#具体链接文章的标题标签self.bodyTag=bodyTag
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61"}
class Crawler:def getPage (self, url):# print('测试'+url)try:req=requests.get (url,headers=headers)except requests.exceptions.RequestException:return Nonereturn BeautifulSoup(req.content,'html.parser')def safeGet (self, pageObj, selector):childObj=pageObj.select(selector)if len(childObj) > 0:return childObj[0].get_text()return ""def search(self, topic, site):bs=self.getPage(site.searchUrl+topic+'&type=web')# print(bs)searchResults=bs.select(site.resultListing)# print(searchResults)for result in searchResults:# print(result)url=result.select(site.resultUrl)[0].attrs['lanmu1']print(url)if (site.absoluteUrl):bs=self.getPage(url)else:bs=self.getPage(site.url+url)if bs is None:print("网页有错")returntitle=self.safeGet(bs,site.titleTag)# print(title)body=self.safeGet(bs,site.bodyTag)if title !="" and body !="":content=Content(topic,url,title,body)content.print()
# #news_list > table:nth-child(5) > tbody > tr:nth-child(1) > td:nth-child(2) > ul > li.news_title > a
crawler=Crawler()
sitedata=[['中国新闻网','https://news.cctv.com','https://search.cctv.com/search.php?qtext=','div .tright','h3.tit span',True,'h1','#content_area']]
sites=[]
for row in sitedata:site_obj=Website(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])sites.append(site_obj)topics=['双十一']for topic in topics:print ('GETTING INFO ABOUT:'+topic)for targetSite in sites:crawler.search(topic,targetSite)

3.4基础案例

import requests
from bs4 import BeautifulSoup
import re
class Website:def __init__(self, name, url, targetPattern, absoluteUrl, titleTag, bodyTag) :self. name = nameself.url = urlself. targetPattern = targetPatternself.absoluteUrl=absoluteUrlself. titleTag = titleTagself.bodyTag = bodyTag
class Content:def __init__(self, url, title, body):self.url = urlself.title=titleself.body = bodydef print(self):print("URL: {}".format(self.url))print("TITLE:{}".format(self.title))print("BODY:{]".format(self.body))
class Crawler:def __init__(self, site):self.site = siteself.visited=[]def getPage(self, url):try:req = requests.get(url)except requests.exceptions.RequestException:return Nonereturn BeautifulSoup(req.content,'html.parser')def safeGet (self, pageObj, selector):selectedElems = pageObj.select(selector)if selectedElems is not None and len(selectedElems) > 0:return '\n'.join([elem.get_text() for elem in selectedElems])return ''def parser(self, url):bs = self.getPage('http://zs.lywhxy.com'+url)print(bs)if bs is not None:title = self.safeGet(bs, self.site.titleTag)print(title)body = self.safeGet(bs, self.site.bodyTag)if title != '' and body != '':content = Content(url, title, body)content.print()def crawl(self): # 获取网站士贝的页面链投bs = self.getPage(self.site.url)targetPages = bs.findAll('a',href=re.compile(self.site.targetPattern))# print(targetPages)for targetPage in targetPages:targetPage = targetPage.attrs['href']# print(targetPage)if targetPage not in self.visited:self.visited.append(targetPage)if not self.site.absoluteUrl:# targetPage = '{}{}'.format(self.site.url, targetPage)# print(targetPage)self.parser(targetPage)#reuters = Website('brook.double', http://www.lywhy.com', '^(/Life/)', False, 'h4 span', 'dd.fr')
# reuters=Website('学院概況','http://ww.lywhxy.com','^(/about/)',False, 'h4 span','h1']
reuters = Website('Reuters','http://zs.lywhxy.com', '/.*?/', False,'h1', 'p')
crawler = Crawler(reuters)
crawler.crawl()

3.5基本案例

import requests
from bs4 import BeautifulSoup
import re
class Content:#所有文意人网页的共同基类def __init__(self,topic,url,title,body):self.topic=topicself.url=urlself.title=titleself.body=bodydef print(self):#打印函数,控制結果输出,友便烹服print("找到的相关关键字的文章:{}".format(self.topic))print("网址:{}".format(self.url))print("标题:{}".format(self.title))print("内容:{}".format(self.body))
class Website:def __init__(self, name, url, titleTag, bodyTag):self.name = nameself.url = urlself.titleTag = titleTagself.bodyTag = bodyTag
class Crawler:def getPage(self,url):try:html = requests.get(url)# html.encoding="UTF-8"except requests.exceptions.RequestException:return Nonereturn BeautifulSoup(html.content,'html.parser')#return BeautifulSoup(html.content, 'html.parser')def safeGet(self, pageObj, selector):#pageObj指bs对象selectedElems = pageObj.select(selector)if selectedElems is not None and len(selectedElems) > 0:return '\n'.join([elem.get_text() for elem in selectedElems])return ''def parse(self, site_obj, url):"""调用 getPage()获取包含目标数据的 bs对象,使用 safeGet()解析 bs对象的 title和 body,非空时存储到 content里"""bs = self.getPage(url)if bs is not None:title = self.safeGet(bs, site_obj.titleTag)print(title)body = self.safeGet(bs, site_obj.bodyTag)# print(body)if title != '' and body != '':content = Content(site_obj.name,url, title, body)content.print()  # 调用封装后的 print()
# 将要爬取的目标网页的 name,url,tag,cssselector等信息存储在嵌套列表里:
siteData = [# ['丽江文化旅游学院','https://lywhxy.com','h1','p']#readArea > div.readAreaBox.content > div.p  #readArea > div.readAreaBox.content body > div.wrap_q > div.main_r.floatleft_q > div.right_r.floatleft_q > div['央视新闻', 'https://news.cctv.com', '.title_area h1', '.content_area p'],['免费小说网','https://www.17k.com/chapter/3328785/44207503.html','div.readAreaBox.content h1','div.readAreaBox.content > div.p'],['故事大全','https://www.qigushi.com/tonghuagushi/1067.html','h1','.article_content'],['新浪新闻','https://news.sina.com.cn/gov/xlxw/2023-10-25/doc-imzshqvs2406187.shtml','h1','.article'],['青年文摘','https://blog.csdn.net/csdnnews/article/details/134025189?spm=1000.2115.3001.5927','h1','.wznr_r'],['领导留言板','','title','body > div.main > div.layout.rm_txt.cf > div.col.col-1.fl > div.rm_txt_con.cf']
]
#print(type(siteData))
# 将上述信息实例化成 website对象:
websites=[]
# print(type(websites))
for site in siteData:# site_obj=Website(site[0],site[1], site[2],site[3])site_obj = Website(site[0], site[1], site[2], site[3])websites.append(site_obj)
crawler = Crawler()
crawler.parse(websites[0],'https://news.cctv.com/2023/10/24/ARTIFCTydl9njIwEibuO0C2j231024.shtml?spm=C94212.P4YnMod9m2uD.ENPMkWvfnaiV.4')
crawler.parse(websites[1],'https://www.17k.com/chapter/3328785/44207503.html')
crawler.parse(websites[2],'https://www.qigushi.com/tonghuagushi/1067.html')
crawler.parse(websites[3],'https://news.sina.com.cn/gov/xlxw/2023-10-25/doc-imzshqvs2406187.shtml')
crawler.parse(websites[4],'http://www.cyp.com.cn/?viewnews-4481.html')
crawler.parse(websites[5],'http://henan.people.com.cn/n2/2023/1020/c351638-40610144.html')

4.拿取数据技巧

4.1通过标签获取

import time
import requests
import random
from bs4 import BeautifulSoup
import re
url='https://www.baidu.com/'
head={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
pages=set()
random.seed(time.time())
html=requests.get(url)
html.encoding='utf-8'
bs=BeautifulSoup(html.text,"html.parser")
#获取页面中所有内链的列表
includeUrl='baidu.com'
links=bs.find_all('a',href=re.compile('^(.*'+includeUrl+')'))
# print(resp.json())
for link in links:print(link.attrs['href'])

4.2通过lamda表达式获取数据

html = httpx.get(url, headers=header, verify=False)
bs = BeautifulSoup(html.text, 'html.parser')
# try:
#     bodys = bs.select('.detail_content p')
#     for body in bodys:
#         body = body.get_text()
#         print(body)
# except:
#     pass
#
#
# biaoge=bs.select('.wenben>table>tbody > tr')
# for bg in biaoge:
#     bg=bg.get_text()
#     bg=bg.replace('\n', '**')
#     print(bg)
#
#
# neirong=bs.select('#mycontent>div>span')
# for nr in neirong:
#     print(nr.text)# txt=bs.find_all(lambda tag: tag.name=='p')
# for i in txt:
#     print(i.text)
#
# txt1=bs.find_all(lambda tag: tag.name=='tbody')
# for i in txt1:
#     print(i.text)# txt2=bs.find_all(lambda tag: len(tag.attrs)==1 and tag.attrs[0]=='title')
# for i in txt2:
#     print(i.text)# txt2=bs.find_all(lambda tag: tag.name == 'span' and tag.has_attr('class') and tag['class'][0] == 'title')
# print(len(txt2))
# for i in txt2:
#     print(i.text)
#
# txt4=bs.find_all(lambda tag: tag.name == 'span' and tag.has_attr('class')==False)
# print(len(txt4))
# for i in txt4:
#     print(i.text)txt5=bs.find_all(lambda tag: tag.name == 'span')
print(len(txt5))
for i in txt5:print(i.text)
biaoge=bs.find_all(lambda tag: tag.name == 'tr')
for bg in biaoge:bg=bg.get_text()bg=bg.replace('\n', '**')print(bg)

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

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

相关文章

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况,以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染(分别对应下方demo1,demo2,demo3)。 setViewpo…

likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法

前言:首先likeshop是一个开发平台,是一个独创的平台就像TP内核平台一样,你可以在这个平台上开发和衍生出很多伟大的产品,以likeshop为例,他们开发出商城系统,团购系统,外卖点餐系统,…

继续以“实用”指导Pythonic编码(re通配表达式)(2024年终总结②)

弃现成工具手剥任务🧐,我哈哈滴就像笨笨的傻大个儿😋。 (笔记模板由python脚本于2025年01月12日 23:29:33创建,本篇笔记适合熟悉正则表达式的coder翻阅) 【学习的细节是欢悦的历程】 Python官网:https://www.python.or…

相机和激光雷达的外参标定 - 无标定板版本

1. 实现的效果 通过本软件实现求解相机和LiDAR的外参,即2个传感器之间的三维平移[x, y, z]和三维旋转[roll, pitch, yaw]。完成标定后,可将点云投影到图像,效果图如下: 本软件的优势:(1)无需特…

WPF系列九:图形控件EllipseGeometry

简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用,比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆:EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制:可以被用作 Path 元素的数据&…

qt设置qwidget背景色无效

最近在做一个界面,有三个子窗体,于是就把各个子窗体分别做成了三个UI,再将3个UI,放到1个UI,再将那一个UI在其他窗体上进行提升。 最后就发现怎么设置qwidget的背景都没有效果。 在Qt中,如果是给Qwidget的…

【Rust学习笔记】Rust 的所有权介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust中的所有权介绍1.1 一个简单的例子1.2 一个稍微复杂的例…

CentOS7下Hadoop集群分布式安装详细图文教程

1、集群规划 主机 角色 DSS20 NameNode DataNode ResourceManager NodeManager DSS21 SecondaryNameNode NameNode NodeManager DSS22 DataNode NodeManager 1.1、环境准备 1.1.1 关闭防火墙 #查看防火墙状态 firewall-cmd --state #停止…

在 Vue 项目中使用地区级联选

在 Vue 项目中使用地区级联选择的完整流程: 1.安装依赖包,这个包提供了中国省市区的完整数据。 npm install element-china-area-data --save 2.导入数据 import { regionData } from element-china-area-data 这个包提供了几种不同的数据格式&#…

基于改进粒子群优化的无人机最优能耗路径规划

目录 1. Introduction2. Preliminaries2.1. Particle Swarm Optimization Algorithm2.2. Deep Deterministic Policy Gradient2.3. Calculation of the Total Output Power of the Quadcopter Battery 3.OptimalEnergyConsumptionPathPlanningBasedonPSO-DDPG3.1.ProblemModell…

Redis为 List/Set/Hash 的元素设置单独的过期时间

一.业务简介 我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。 这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。但这样并不…

【51单片机】03 蜂鸣器-播放音乐

蜂鸣器-播放音乐 一、原理介绍1.硬件电路 二、练习1.让蜂鸣器发声2.尝试演奏小星星 一、原理介绍 蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。 有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音 无源蜂鸣器:需要提供特定频率的声音信号,才能…

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器:定时器0、定时器1、定时器2 注意:51系列单片机一定有基本的2个定时器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器&#xff…

LeetCode热题100-合并两个有序链表【JavaScript讲解】

题目: 题解: 我们目前已经知道两条链表都是有序链表,我们就可以通过迭代的方法实现上述问题。当list1和list2都不是空链表时,判断list1和list2哪个头节点的值更小,将较小的值添加到结果里,被添加到结果里的…

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符(App ID)、证书,描述文件 3、首先创建标识符,用于新建App应用 3-1、App的话直接选择第一个App IDs,点击右上角继续 3-2、选择App&#x…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle(app模块)里引入依赖,然后Sync Now一下: android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…