20221119day12:数据采集

一、前端:模板层的html、js、css写在index.html文件里面

1.html
2.css样式
3.js:F12控制台,js代码的位置,可以直接输入alert(123),跟踪一些代码,查看他的js加密,可以在这个位置上输入一些代码,在他的基础上注入代码,
可以查看他的变量,暴露他的方法什么的

二、顶点小说:F12网络

1.请求标头
User-Agent:后边跟的相当于自我介绍
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36

referer:上一个请求页面的链接
referer: https://www.baidu.com/link?url=OYwuVlZfXc4rlAhH81YiU-GT2xN1i0m_U56ADrzx1-HhWXDpg9VdxrIeWn1tVy8_&wd=&eqid=b4ba094b0000b96100000006637c9470

Host:请求服务器,当前的资源来自于哪个服务器
Host: m.23wx.cc

http、https多了一个正负验证
共同点:这两个都是无状态,无状态协议:他不知道你是谁,这个协议本身无法传递用户的信息


2.cookie是用户身份令牌,本质是一把钥匙      客户端
登录的本质就是生成cookie
例如:李白登录淘宝购买东西-输入用户名、密码-后台验证(实际上验证两次,第一次用户名、密码输入的样式对不对,通过后,会把信息传递到后台第二次验证,
传到后台查数据库,看看李白注册的用户名、密码对不对,如果对的话,将会在李白的浏览器生成一个cookie,这个cooie里面有一个session id。

session id:李白   本地是一串乱码,相当于一把钥匙,那么李白的信息存在哪里呢?李白的信息存在淘宝的服务器上。为什么李白本地只存在了一串乱码,
信息存到服务器上呢?因为存在本地十不可以的,开发的东西会人为客户端的一切十不安全的。本地只存在session id:李白和名字这两个。
购买流程实际上发生在服务器上,本身李白十没法处理的。在淘宝服务器上拿到数据在淘宝服务器上用,用户是看不见的。这样李白就可以完成购买。
session          在服务器端

cookie是在几个网站页面共享的,无论李白点到哪个页面,只要李白没有清cookie,这几个页面都知道他是李白。在用户本地,也就是客户端。
session机制十依赖于cookie机制产生的,必须首先cookie能用,才会有session的事情,也就是说本地生成的cookie里面本身会带一个钥匙session id,
session的箱子是在服务器端,你就可以借助cookie在各个页面共享这把钥匙。
cookie本身还有追踪用户行为的作用,本身点击了哪些网站,哪些商品,他都会知道,比如电机的次数,浏览的频率等。这样的话有助于它构建用户画像。

总结:cookie是什么?
答:
cookie存在于客户端本地,实际上是浏览器的资源,本身在浏览器里面,它的作用就是辅助http、https共享用户身份,追踪用户身份的一个身份令牌,
相当于一个身份证,但是cookie里面一般只存很少的信息和一个session id,你的主要信息是放在服务器端的,如果真的需要别的一些关键信息的话,
他会拿你的session id去服务器端寻找,然后在服务器端去用,而不会让你看见,就这么一个机制,主要资源不在本地是为了防止你对这个资源进行篡改,
从而达到一些目的,比如你没有开通会员,放在本地的话,万一自己改成会员,岂不是对他造成了损失。所以他把这些关键信息放在服务器端了,你没法篡改,
你只有一把钥匙,你只能查,拿来用,而不能对他进行任何修改,这就是cookie,捏本地叫cookie,服务器那端叫session id3.想要退出自己登陆的csdn?
直接清除cookie就行了,点击网页有上角的三个点,选择设置-隐私搜索和服务-点击一下清除浏览数据-勾选Cookie和其他站点数据-点击立刻清除
Cookie: PHPSESSID=c0842bd1e6347ba5d785554adf9e78d7; Hm_lvt_9721db7bd190f0cb23e5267d9f8eaeb1=1669108855; Hm_lpvt_9721db7bd190f0cb23e5267d9f8eaeb1=1669109361
cookie里面除了有session id之外,还存了一个加密的字符串,你必须传给我正确的加密字符串,才会让你访问这个页面,也就是说我们现在有一个加密字符串,
可能就藏在cookie里面,那就需要查找它cookie在哪里生成的,什么时候把这个字符串塞进去的,这个字符串是怎么来的,需要知道这些问题,我们就涉及到一个
任务就是追踪cookie生成过程,现在只是了解有这么一回事就行。
第二点就是有些网站必须登录之后,才能去抓取信息,比如天眼查。你如果不登陆的话,有些信息可能都不展示。那怎么抓?

cookie池塘:实际上就是一个数据库,里面存了用户名和密码。

三、xpath抓取顶点小说3页数据

# 先获取所有分类链接

import requests
from lxml import etree
import pymysql
headers = {
'Host': 'www.23us.co',
'Referer': 'https://www.baidu.com/link?url=Kf8hqBe68nV-DipI3bExcurGlRpGxvq2j0kBbVOrk37&wd=&eqid=91dc6e33001b84210000000263787966',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'

}

# source = requests.get('http://www.23us.co/',headers=headers).content.decode('gbk')
# base = etree.HTML(source).xpath('//ul[@class="update"]/li')[:-1]
# print(base)
#
# for i in base:
#     types = i.xpath('p[1]/a[1]/text()')
#     name = i.xpath('p[1]/a[2]/text()')
#     href = i.xpath('p[1]/a[2]/@href')
#     print(name,href)
db = pymysql.connect(user='root',password='123456',db='顶点小说')#建立链接
cursor = db.cursor()#游标

# 第2步:获取最大页数
def get_max_page(urls):
    source = requests.get(urls).content.decode('gbk')
    max_page = etree.HTML(source).xpath('//a[@class="last"]/text()')  #获取每个分类下的最大页数
    return int(max_page[0])  #.xpath完之后是列表,先取值max_page[0],str转成int

# 第4步:向数据库book书表里存数据:status0没开始抓之前、status1开始抓、status2完成、status3抓取失败
def save_chapter_list(**kwargs):
    book_name = kwargs.get('book_name','未取到')
    book_id = kwargs.get('book_id','未取到')
    status = kwargs.get('status',0)
    chapter_list_url = kwargs.get('chapter_list_url','未取到')
    #写入sql语句
    sql = 'insert into book(book_name,book_id,status,chapter_list_url) values ("{}","{}","{}","{}")'.format(book_name,book_id,status,chapter_list_url)
    cursor.execute(sql)
    db.commit()

# 第7步:操作数据库向book表存数据
def save_book(**kwargs):
    chapter_name = kwargs.get('chapter_name','未取到')
    bid = kwargs.get('bid','未取到')
    status = kwargs.get('status',0)
    chapter_contents = kwargs.get('chapter_contents','未取到')
    chapter_url = kwargs.get('chapter_url','未取到')
    sql = 'insert into chapters(chapter_name,bid,status,chapter_contents,chapter_url) values ("{}","{}","{}","{}","{}")'.format(chapter_name,bid,status,chapter_contents,chapter_url)
    print(sql)
    cursor.execute(sql)
    db.commit()
    pass

# 第3步:获取章节列表页信息
def get_book_chapter_list(urls):
    source = requests.get(urls).content.decode('gbk')
    hrefs = etree.HTML(source).xpath('//tr/td[1]/a')  #获取书的链接

    # 把get_book_id('http://www.23us.co/class/3_1.html')变成http://www.23us.co/html/3/3553
    for i in hrefs:
        hrefs = i.xpath('@href')[0]  #公共部分
        book_name = i.xpath('text()')[0]  #书名
        book_id = hrefs.split('/')[-1]  #根据/拆分,取最后一个
        chapter_list_url = 'http://23us.co/html/{}/{}/'.format(book_id[:2],book_id) #章节列表页链接
        #存值和数据库里面的字段对上
        save_chapter_list(book_name=book_name,book_id=book_id,status=0,chapter_list_url=chapter_list_url)
        yield chapter_list_url  #装饰器


# 第6步:匹配内容的函数
def get_contents(urls):
    #正则匹出书的id,'https://23.us.co/html/75/75084/29219318.html'
    import re
    source = requests.get(urls).content.decode('gbk')

    demo = re.compile('http://23us\.co/html/\d+/(\d+)/\d+\.html')
    book_id = demo.findall(source)[0]  #书的id
    title = etree.HTML(source).xpath('//h1/text()')[0]  #题目
    contents = ''.join(etree.HTML(source).xpath('//dd[@id="contents"]/text()'))  #内容
    return save_book(bid=book_id,chapter_name = title,chapter_contents=contents,chapter_url = urls)

# 第5步:获取标题和内容
def get_contents_title(urls):
    source = requests.get(urls).content.decode('gbk')
    hrefs = etree.HTML(source).xpath('//tr/td/a/@href')
    if len(hrefs)>0:  #先做个判断,完整的hrefs29219318.html
        for href in hrefs:
            chapter_url = urls+href  #章节的链接
            get_contents(chapter_url)

# 第1步:获取第1页~第10页
for type in range(1,11):  #遍历
    first_page_url = 'http://23us.co/class/{}_1.html'.format(type)  #和链接拼接,获取所有分类下的第1页的链接
    max_page = get_max_page(first_page_url)  #最大页数
    for page in range(1,max_page+1):  #遍历起始页~最大页
        #'http://23us.co/class/{}_1.html'利用:split('_')[0],根据_分割取前半部分,_页数再加.html,可得到每一页的链接
        every_page_url = first_page_url.split('_')[0]+'_'+str(page)+'.html'  #每一页的链接
        chapter_list_url = get_book_chapter_list(every_page_url)
        for urls in chapter_list_url:
            get_contents_title(urls)

# get_contents_title('http://23us.co/html/75/75084/')


# 速度太差、没有去重,断点续抓
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ゆきな

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值