爬虫基础——认识爬虫

互联网一般架构

  • c/s: 即 client server 客户端 服务端
  • b/s :即 browser server 浏览器 服务端
  • m/s :即 moblie server 移动端 服务端
http协议

目前互连网上90%的网络传输都是基于http协议。
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

报文格式

报文格式必须严格遵守
报文格式必须严格遵守

爬虫

import socket
import re

client = socket.socket()    # 创建客户端
client.connect(('image.baidu.com',80))  # 链接域名

request = 'GET /search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB HTTP/1.0\r\nHost: image.baidu.com\r\n\r\n'   # 构造http报文
client.send(request.encode())   # 转二进制发送报文

res = b''
data = client.recv(1024)    # 一次接收1024个字节

while data: # 循环接收一直到空为止
    res += data
    data = client.recv(1024)

client.close()
img_urls = re.findall(b'"middleURL":"http://(.*?)"',res,re.S)   # 获取页面中需要的url

s = 0   # 循环下载图片
for i in img_urls:
    print(i)
    a = i.decode()
    b = a.split('com')
    c = a.split('/')
    img_request = 'GET '+b[1]+' HTTP/1.0\r\nHost: '+c[0]+'\r\nReferer: http://image.baidu.com/search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB\r\n\r\n' # 拼接页面中图片url的请求报文

    img_client = socket.socket()    # 创建图片url的链接
    img_client.connect((c[0],80))
    img_client.send(img_request.encode())

    res = b''
    img_data = img_client.recv(1024)

    while img_data:
        res += img_data
        img_data = img_client.recv(1024)

    img_content = re.findall(b'\r\n\r\n(.*)',res,re.S)

    print(s)
    with open("img/"+str(s)+'.jpg','wb') as p:
        p.write(img_content[0])

    s+=1
    img_client.close()

一个爬取百度图片中某一页的代码,可能很繁琐,但是能运行

  1. 首先导入模块,import socketimport re套接字和正则两个模块
  2. 创建客户端并链接域名
    client = socket.socket()创建一个客户端,socket.socket()固定用法
    client.connect(('image.baidu.com',80))链接需要爬取的域名content()里面必须是元组
  3. 构造报文并以二进制的形式发送
    request = 'GET /search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB HTTP/1.0\r\nHost: image.baidu.com\r\n\r\n' 构造http报文,报文格式有严格要求
    client.send(request.encode()) 转二进制发送报文
  4. 接受响应
    res = b''返回的信息是以二进制的形式发送的,建一个二进制变量接受
    data = client.recv(1024) 一次接收1024个字节
while data: 
    res += data
    data = client.recv(1024)
    ```
    一个响应肯定不止1024字节, 循环接收一直到空为止
 5. `img_urls = re.findall(b'"middleURL":"http://(.*?)"',res,re.S)   `用正则将需要的信息匹配出来
 这样,一个爬虫的基本流程就出来了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值