个人学习记录向|爬虫,从入坑到入土(1)

//本文是基于DataWhale教程的扩充和总结&学习心得,双斜杠后是脑洞和废话
//非完全原创

Chap1:互联网与HTTP

互联网

互联网(internet)是指网络与网络所串联成的庞大网络,这些网络以一组标准的网络协议族相连,连接全世界几十亿个设备,形成逻辑上的单一巨大国际网络。分为广域网、城域网、局域网。

因特网

当我们所说的是上文谈到的那个全球最大的也就是我们通常所使用的互联网络时,我们就称它为“因特网”(Internet)或称为“国际互联网”。因特网是互联网的一种。

万维网

万维网(WWW、World Wide Web、Web、3W)。WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。 是互联网提供的服务之一。应用层使用了HTTP协议就称为万维网。

//大概类似于:互联网是火锅,因特网是提起火锅时我们的第一反应——四川火锅,虽然四川火锅是火锅的一种,同时也是火锅中最大的一类(暂定),但并不是火锅的全部。而万维网则像火锅自助,是火锅提供的服务之一(还有堂食火锅、速食火锅和外卖火锅)。

HTTP

HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准。客户端(即用户代理,user agent)通过浏览器、爬虫等,向服务器指定端口发起HTTP请求。应答服务器上存储着资源。User agent与origin server间可能还有中间层,如代理服务器、网关(网间连接器、协议转换器)、tunel(一种协议)等。

HTTP并没规定必须使用TCP/IP协议。

//大概就像固定的交易标准却不一定要有固定的合同文本吧,银货两讫就完事儿了

Chap2:网页基础

网页组成

总的来讲:HTML:骨 CSS:皮 JS:肉

这里记一下细节:标签闭合。值要用引号包裹。

和另一系列笔记内容重复了,略。

HTML DOM

文档、HTML元素、HTML元素内的文本、HEML属性、注释都是节点。构成了一个HTML DOM树。每个节点都可以被修改、创建、删除、通过JS访问。

css

开头表示按id选择,.是按class选择。css选择器支持嵌套选择,按从前往后的顺序依次筛选,中间隔空格(不加空格表示并列)

开发者工具

  • Elements:浏览器渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。

  • Network:可网页向服务器请求的资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。

  • Source:源代码面板,用来调试JavaScript。

  • Console:控制台面板,显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。

  • Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。

  • Memory:提供比Performance更多的信息,比如跟踪内存泄漏。

  • Application:检查加载的所有资源。

  • Security:即安全面板,可以用来处理证书问题等。

切换设备模式:Ctrl + Shift + M。

Chap3:requests.get

爬虫过程:访问站点,定位信息,得到信息

//访问饭店,定位我要的菜,得到我要的菜

练习一:爬取The zen of Python

import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text

得到element,通过审查元素知道文本被包裹在pre标签内

with open('zen_of_python.txt','w')as f:
    f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
print(text[text.find('<pre')+28:text.find('</pre>')-1])
#class="literal-block"> == &0一共28个字符

这段文本写得不错的,po一下

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

或者用urllib库

import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])

Chap4:request.post

练习二:爬取iciba

通过审查元素找到POST数据

1.png

在XHR里,很好找
preview查看到content的out是翻译结果。

想要用爬虫自动获取翻译结果,就要模拟表单和user agent。让爬虫假装是浏览器,并提交正常的请求格式。

import requests
def translate(word):
    url="http://fy.iciba.com/ajax.php?a=fy"
    data={
        'f': 'auto',
        't': 'auto',
        'w': word,
    }
    #表单格式
    headers={
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }#User-Agent,让爬虫假装自己是浏览器
    response = requests.post(url,data=data,headers=headers)     
    #发起请求
    json_data=response.json()   
    #获取json数据
    return json_data
def run(word):    
    result = translate(word)['content']['out']  
    #按索引找到翻译结果
    print(result)
    return result

def main():
    with open('zen_of_python.txt') as f:
        zh = [run(word) for word in f]

    with open('zon_of_python_zh-CN.txt', 'w') as g:
        for i in zh:
            g.write(i + '\n')
            
if __name__ == '__main__':
    main()
2.png

原始的json data是这样子的。

//有点震惊的,iciba居然不反爬

翻译效果还不错的,po一下

美丽胜过丑陋。
 外显优于内隐..
 简单胜于复杂。
 复杂胜于复杂。
 平比嵌套好..
 疏而不密..
 可读性计数。
 特殊情况不足以打破规则。
 尽管实用性胜过纯度。
 错误永远不应该悄悄地过去。
除非有明确的沉默。
 面对暧昧,拒绝猜测的诱惑..
 应该有一种----最好只有一种----明显的办法来做到这一点。
 虽然这种方式一开始可能不明显,除非你是荷兰人。
 现在总比永远好。
虽然从来没有比现在更好。
 如果实施很难解释,那是个坏主意。
 如果实现很容易解释,这可能是个好主意。
 命名空间是一个伟大的想法-让我们做更多的这些!

Chap5:api

调用Api需要有AK(Api Key)

练习三:利用百度地图api获取地理编码

import requests

def getUrl(*address):
    ak = ''  ## 填入你的api key
    if len(address) < 1:
        return None
    else:
        for add in address:   
            url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output=json&ak={1}'.format(add,ak)  
            yield url
            

def getPosition(url):
    '''返回经纬度信息'''
    res = requests.get(url)
    #print(res.text)
    json_data = eval(res.text)
    
    if json_data['status'] == 0:
        lat = json_data['result']['location']['lat'] #纬度
        lng = json_data['result']['location']['lng'] #经度
    else:
        print("Error output!")
        return json_data['status']
    return lat,lng

if __name__ == "__main__":
    address = ['北京市清华大学','北京市北京大学','保定市华北电力大学','上海市复旦大学','武汉市武汉大学']
    for add in address:
        add_url = list(getUrl(add))[0]
        print('url:', add_url)
        try:
            lat,lng = getPosition(add_url)
            print("{0}|经度:{1}|纬度:{2}.".format(add,lng,lat))
        except Error as e:
            print(e)

AK是百度地图API申请的,怕泄露个人信息所以直接贴例程上来了。

可以很清晰地看出,大致流程就是:按格式发送请求,收取信息,对信息格式进行处理。非常方便快捷。

官方文档: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

Chap6:JS与AJAX

AJAX

Asynchronous JavaScript and XML,异步JavaScript与XML。得益于AJAX,网页可以在页面中使用JS,实现了对部分数据的灵活加载。在爬爬爬的过程中,有时会遇到浏览器看到的与抓取内容不同,这就是因为抓到的是原始HTML数据,浏览器中的是JS加工处理后的数据。为解决这个问题,一是分析AJAX(逆向工程)、二是模拟浏览器环境。

JavaScript

面向对象、动态类型的解释性语言。作为新一代浏览器脚本语言被设计出的它,开始涉足服务器端。

特点

动态语言:程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。

脚本语言:脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言,只在被调用时进行解释或编译,然后执行。

弱类型:指的是语言类型系统的类型检查的严格程度,弱类型的语言在声明变量的时候不必进行变量类型的确定,语言的运行时会隐式做数据类型转换,对于弱类型语言来说,不同类型的变量可以进行直接运算,而强类型的则不可以。

与JAVA的关系

除了变量类型和命名规范等细节,JavaScript与Java关系并不大。Netscape公司最初为之命名“LiveScript”,但当时正与Sun公司合作,加上Java语言所获得的巨大成功,为了“蹭热点”,遂将其名字改为“JavaScript”。

else

jQuery库的教程:https://www.runoob.com/jquery/jquery-tutorial.html

CDN:Content Delivery Network(内容分发网络)。如果网页使用了CDN,当用户向网站服务器请求文件时,CDN会从离用户最近的服务器上返回响应,这在一定程度上可以提高加载速度。

-20200421-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352