数据处理及爬虫学习

数据处理

json

json格式:

  1. 格式1:[{“name”:”jack” “age”:”18”} ,{“name”:”jack” “age”:”18”} ]
  2. 格式2:{“name”:”jack” “age”:”18”}{“name”:”jack” “age”:”18”}{“name”:”jack” “age”:”18”}{“name”:”jack” “age”:”18”}
    读取json文本,有两种方法:
  3. 针对json格式1,通过json.load(file)直接转换为多个dict
  4. 针对json格式2,先转换为list,然后通过读取每一个{},通过json.loads(line)将str转换dict格式
    字典获取数据
    dict中嵌套了多个{},采用dict:{“label”: {“address”: {“台湾”: [[15, 16]]}, “name”: {“彭小军”: [[0, 2]]}}},使用dict[“label]”.item()可以获取到下层的key和value
    写入文本:
    f.write(json.dumps(content, ensure_ascii=False) + ‘\n’)普通文本存储 将python对象转换为json文本
    f.write(json.dumps(dict(item), ensure_ascii=False) + ‘,’+’\n’)

JSON转CSV:
将JSON转为字典,读取key作为表list第一行,value作为其余行输入。
import json
fr=open("./傣族/Json/new_文化.json",“r”,encoding=“utf-8”)
ls=json.load(fr)
data=[ list(i for i in ls[0].keys())[:4]]
for item in ls:
data.append(list(i for i in item.values())[:4])
fr.close()
fw=open(“python4.csv”,“w”,encoding=“utf-8”)
for item in data:
fw.write(",".join(item)+"\n")
fw.close()

爬虫细节

1.函数返回的是一个list,可以用get_data()[i]一个一个结果输出
2.p标签中的文本是多个p,用join将文本连接起来

Mongodb操作:
查询:db.getCollection(“节日”).find({$and:[{title:/傣历新年/}]})
模糊查询:包含:/XXX/,开头/XXX/,结尾/XXX/ ,忽略大小写/xxx/i
Mongodb连接python的代码:
conn=MongoClient(‘localhost’,27017)#端口号
db=conn[“Testconn”]#连接数据库名
collection=db[“节日”]#集合名
读取json文件,一行一行取出,存入到mongodb中:
for i in json.load(f):
try:
self.collection.insert(i)
xpath:
表达式 描述
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
… 选取当前节点的父节点。
@ 选取属性。

** 简单爬虫1:request(网页爬取后才用xpath取值)**
1.get_url()
1.设置headers:{}
2.Req=Request(url,headers)
3.Urlopen(req)
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36’}
在request中添加headers
入口:
req = urllib.request.Request(url=url,headers=headers)
res = urllib.request.urlopen(req)
urllib是 Python 内置的 HTTP 请求库
· request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。

· 第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。

· 第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。

· 第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

2.提取html中需要的文本(得到的是字符串):
1.html = get_url(url).read().decode(‘utf-8’)
2.转换为element对象:from lxml import etree
etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
3.如果想通过xpath获取html源码中的内容,就要先将html源码转换成_Element对象,然后再使用xpath()方法进行解析。
selector.xpath(’.//div[@class=“article-title”]/h2/text()’)[0]
4.存储:存储为json格式,类似字典,将字典dict={}转换成json格式。
json.dump(dic,file,ensure_ascii=False,indent=1)
BS4爬虫2:(直接用bs对象取标签)

爬虫原理:通过网址获取网页文本,然后对网页文本进行解析取值
包导入:
from bs4 import BeautifulSoup
是一个可以从HTML或XML文件中提取数据的Python库.

获取网页文本:格式转为“UTF-8”
res = requests.get(url)
res.encoding = “UTF-8”
创建对象:soup = BeautifulSoup(res.text,‘html.parser’)

Soup.find_all( name , attrs , recursive , string , **kwargs )
name:查找所有名字符合name的tag,参数可以是所有的过滤器,包括
字符串/列表/正则表达式/True/方法;
attrs:指定的tag属性attrs={“id”:“link3”},传递一个字典进去
recursive:确定是否只搜索直接子节点,如果只想搜索直接子节点,=false
string:需要查找的字符串内容,可以是字符串/列表/正则/true
keyword:需要搜索的tag属性。
limit:设定需要查找的数量。

标签重叠关系:
取标签中的值:获取的是大范围的标签为div,class为‘ ’
for tag in soup.find_all(‘div’,class_ = ‘ztzy_w_comm_l’):
1.urls = tag.find_all(‘a’)#标签下找url
2.tag.get_text()#可以的到标签的文本

双重循环
for text in soup.find_all(‘td’,class_=‘f14_000000’):
for c in text.find_all(‘p’):
c.get_text()
#获取html中所有class:td,在获取每一个td下的p

标签内部取值
要取出中的href:
urls=l.find_all(‘a’)
for href in urls:
url=href.get(‘href’)

爬虫3:scrapy框架
4个依赖库:lxml,pyOpenSSL,Twisted,Pywin32
注意:1.allow_domain的冲突会报错
2.li_list=response.xpath("//div[@class=‘ztzy_w_comm_r’]/ul/li")
for li in li_list:
代表的循环是指标签的循环,标签相同且多个就需要该循环去获取每一个标签下的值

创建项目:scrapy startproject xxx
进入项目:cd xxx #进入某个文件夹下
创建爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域)
生成文件:scrapy crawl xxx -o xxx.json (生成某种类型的文件)
运行爬虫:scrapy crawl XXX ==cmdline.execute(‘scrapy crawl kmust_spider’.split())

列出所有爬虫:scrapy list
获得配置信息:scrapy settings [options]
scrapy.cfg: 项目的配置文件
kmust/: 该项目的python模块。在此放入代码(核心)
items.py: 项目中的item文件.(这是创建容器的地方,爬取的信息分别放到不同容器里)title = scrapy.Field()
pipelines.py: 项目中的pipelines文件.
settings.py: 项目的设置文件.(我用到的设置一下基础参数,比如加个文件头,设置一个编码)
spiders/: 放置spider代码的目录. (放爬虫的地方)

自定义代码:
1.创建一个类,继承于scrapy.Spider
2.爬虫Name唯一,allow_domian,start_url
3.parse(reponse)是一个Spider方法,被调用时,每个初始url响应后返回的Response对象,将会作为唯一的参数传递给该方法。该方法负责解析返回的数据,提取数据以及生成需要进一步处理的url的Responst对象
4.来利用response中的几个方法取数据

· xpath(query):传入XPath表达式query,返回该表达式所对应的所有节点的selector list列表
如果只想提取第一个匹配的元素,可以调用选择器 .extract_first(),如果获取不到则返回None可以通过使用extract_first(default=‘xxx’)来自定义返回数值
· extract(): 序列化该节点为Unicode字符串并返回list列表。
· re(regex):根据传入的正则表达式对数据进行提取,返回Unicode字符串列表。regex可以是一个已编译的正则,也可以是一个将为re.compile(regex)编译为正则表达式的字符串。

xpath("//div[@class=‘views-field views-field-title’]/span[@class=‘field-content’]/a")
each_news.xpath("./@href").extract()[0]获取href

三个yield:作用generator每产生一个值,函数被冻结,被唤醒会产生新的值
总结:网页中一页中的几个页面按批次回调给parse_detail进行封装;一页取完后,爬取下一页,又回调parse重复操作。
1.yield scrapy.Request(url=url, callnack=self.parse_detial, meta={‘ve’: tem}
)则是把获取到的url利用request对象构造为请求再利用callback回调到自己指定的Spideritem还将函数 parse_detail 作为回调函数来从响应中提取所需的数据。
Meta是一个字典参数,将parse函数中的item对象传给下一个函数

next_page =下一页
if self.i < 7:
next_url = ‘http://www.surveydepartment.gov.mm’+next_page
print(next_url)
self.i += 1
2.yield scrapy.Request(next_url, callback=self.parse)
这里是在爬取完一页的信息后,我们在当前页面获取到了下一页的链接,然后通过 yield 发起请求,并且将 parse 自己作为回调函数来处理下一页的响应。
Def parse_detial():
item = response.meta[‘ve’]
3.yield item #对文本进行封装传给pipline处理

存储数据,可以是数据库,也可以是文件
def process_item(self, item, spider):
# with open(“mmnews.txt”,‘a+’,encoding=‘utf-8’) as fp:
with open(‘mm/’+item[‘title’]+’.txt’, ‘a’, encoding=‘utf-8’) as fp:
# fp.write(item[‘title’] + ‘\n’)
fp.write(str(item[‘content’]) )

执行if name == ‘main’:
from scrapy import cmdline
cmdline.execute(‘scrapy crawl kmust_spider’.split())

Setting:ROBOTSTXT_OBEY = False
CONCURRENT_REQUESTS = 32
添加:ITEM_PIPELINES = {
‘kmust.pipelines.KmustPipeline’: 300,

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值