js_set.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js_set</title>
</head>
<body>

<script>
    /*参考:https://blog.csdn.net/DurianPudding/article/details/88116732
    * 知识点:
    *   1.集合添加值。
    *       let s = new Set();
    *       s.add(value);
    *   2.Set 结构不会添加全等(===)的值,集合有去重的功能。
    *   3.集合中可以容纳的数据类型包括:字符串,数字,对象,NaN 等。
    *   4.set.add() -> set 对象。*/
    // 0.集合的声明、初始化。
    let s = new Set();
    let s2 = new Set([1, 2, 3, 4, 4]);
    console.log("s2:", s2);
    console.log(s2.size);
    // s2: Set(4) {1, 2, 3, 4}
    // 4

    // 1.集合转换成数组。
    console.log("\n1.");
    console.log([...s2]);
    console.log(Array.from(s2));
    // (4) [1, 2, 3, 4]
    // (4) [1, 2, 3, 4]
    // 数组去重。
    let arr = [1, 1, 2, 2];
    console.log([...new Set(arr)]);
    console.log(Array.from(new Set(arr)));
    // (2) [1, 2]
    // (2) [1, 2]

    // 2.把数组的值添加到集合。
    console.log("\n2.");
    [2, 2, 2, 3, 5, 5].forEach(x => s.add(x));
    console.log("s:", s);
    // s: Set(3) {2, 3, 5}

    // 4.集合中的值的比较。
    // set 中 NaN 等于自身,其余比较相当于 ===
    // 值有不全等的值才会被添加。
    console.log("\n4.");
    let s3 = new Set();
    s3.add(NaN);
    s3.add(NaN);
    console.log("s3:", s3);
    // s3: Set(1) {NaN}
    let o = {a: 1, b: 2};
    s3.add(o);
    s3.add(o);
    console.log("s3:", s3);  // 因为 o === o,所以只添加了一次。
    // s3: Set(2) {NaN, {a: 1, b: 2}}
    console.log({a: 1, b: 2} === {a: 1, b: 2}); // false
    s3.add({a: 1, b: 2});
    console.log("s3:", s3);
    // s3: Set(3) {NaN, {a: 1, b: 2}, {a: 1, b: 2}}
    // 这里体现了对象之间引用不同不全等,即使值相同。

    // 5.set.add() -> set 对象。
    //      所以,可以链式操作。
    console.log("\n5.");
    let s4 = new Set();
    s4.add("hello world!");
    s4.add("hello world!").add("hello China!");
    console.log("s4:", s4);
    // s4: Set(2) {"hello world!", "hello China!"}

    // 6.成员判断。
    console.log("\n6.");
    console.log(s4.has("hello China!"));  // true

    // 7.删除成员
    console.log("\n7.");
    console.log("s4:", s4);
    s4.delete("hello world!");
    console.log("s4:", s4);
    // s4: Set(2) {"hello world!", "hello China!"}
    // s4: Set(1) {"hello China!"}

    // 8.集合的遍历。
    // set 键名=键值
    console.log("\n8.");
    let set = new Set(['red', 'green', 'blue']);
    console.log("set:", set);
    // set: Set(3) {"red", "green", "blue"}
    console.log("set.keys():", set.keys());
    // set.keys(): SetIterator {"red", "green", "blue"}
    // 返回键名
    for (let item of set.keys()) {
        console.log(item);  // red green blue
    }
    console.log("set.values():", set.values());
    // set.values(): SetIterator {"red", "green", "blue"}
    // 返回键值
    for (let item of set.values()) {
        console.log(item);  // red green blue
    }
    console.log("set.entries():", set.entries());
    // 返回键值对
    for (let item of set.entries()) {
        console.log(item);
    }
    // set.entries(): SetIterator {"red" => "red", "green" => "green", "blue" => "blue"}
    // (2) ["red", "red"]
    // (2) ["green", "green"]
    // (2) ["blue", "blue"]

    for (let i of set) {
        console.log(i);  // red green blue
    }
    set.forEach(value => console.log(value));  // red green blue


    // 以下代码未整理。
    // // 数组的 map 和 filter 方法也可以间接用于Set
    // let s = new Set([1, 2, 3]);

    // // map 将原数组映射成新数组
    // s = new Set([...s].map(x => x * 2));
    // console.log(s);
    //
    // // filter返回过滤后的新数组
    // s = new Set([...s].filter(x => (x % 3) == 0));
    // console.log(s);
    //
    // // 实现并集、交集、差集
    // let a = new Set([1, 2, 3]);
    // let b = new Set([4, 3, 2]);
    //
    // let union = new Set([...a, ...b]);
    // console.log(union);
    //
    // let intersect = new Set([...a].filter(x => b.has(x)));
    // console.log(intersect);
    //
    // let difference = new Set([...a].filter(x => !b.has(x)));
    // console.log(difference);
    //
    // // 在遍历操作中,同步改变原来的Set结构的两种变通方法
    //
    // // 1.利用原Set结构映射出一个新的结构,然后赋值给原来的Set结构
    // let set1 = new Set([1, 2, 3]);
    // set1 = new Set([...set1].map(val => val * 2));
    // console.log(set1);
    //
    // // 2.利用Array.from
    // let set2 = new Set([1, 2, 3]);
    // set2 = new Set(Array.from(set2, val => val * 2));
    // console.log(set2);
</script>

</body>
</html>




import requests import random import parsel visited_urls = set() # 保存已经访问过的链接 page = 1 while True: # 循环爬取 url = f'https://travel.qunar.com/travelbook/list.htm?page={page}&order=hot_heat' html_data = requests.get(url).text selector = parsel.Selector(html_data) lis = selector.css('.list_item h2 a::attr(href)').getall() # 遍历当前页面中的所有链接 for li in lis: detail_url = 'https://travel.qunar.com' + li if detail_url in visited_urls: # 如果链接已经访问过,则跳过 continue visited_urls.add(detail_url) # 将链接加入集合中 detail_html = requests.get(detail_url).text time.sleep(random.randint(3, 5)) detail_selector = parsel.Selector(detail_html) title = detail_selector.css('.b_crumb_cont *:nth-child(3)::text').get() comment = detail_selector.css('.title.white::text').get() view_count = detail_selector.css('.view_count::text').get() date = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get() days = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get() money = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get() character = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get() play_list = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data > span::text').getall() for play in play_list: print(play) print(title, comment, view_count, date, days, money, character, play_list, detail_url) time.sleep(random.randint(3, 5)) # 判断是否需要继续爬取 if len(lis) == 0 or page >= 20: break page += 1这段代码怎么将爬取出来的所有数据保存到csv文件
06-13
你可以使用 Python 自带的 csv 模块将数据保存到 CSV 文件中。在你的代码中,你可以在循环中将每个页面的数据添加到一个列表中,然后在退出循环后将整个列表保存到 CSV 文件中。以下是修改后的代码: ``` import requests import random import parsel import csv visited_urls = set() # 保存已经访问过的链接 page = 1 data_list = [] # 保存所有数据 while True: # 循环爬取 url = f'https://travel.qunar.com/travelbook/list.htm?page={page}&order=hot_heat' html_data = requests.get(url).text selector = parsel.Selector(html_data) lis = selector.css('.list_item h2 a::attr(href)').getall() # 遍历当前页面中的所有链接 for li in lis: detail_url = 'https://travel.qunar.com' + li if detail_url in visited_urls: # 如果链接已经访问过,则跳过 continue visited_urls.add(detail_url) # 将链接加入集合中 detail_html = requests.get(detail_url).text time.sleep(random.randint(3, 5)) detail_selector = parsel.Selector(detail_html) title = detail_selector.css('.b_crumb_cont *:nth-child(3)::text').get() comment = detail_selector.css('.title.white::text').get() view_count = detail_selector.css('.view_count::text').get() date = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get() days = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get() money = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get() character = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get() play_list = detail_selector.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data > span::text').getall() # 将当前页面的数据添加到列表中 data_list.append([title, comment, view_count, date, days, money, character, play_list, detail_url]) for play in play_list: print(play) print(title, comment, view_count, date, days, money, character, play_list, detail_url) time.sleep(random.randint(3, 5)) # 判断是否需要继续爬取 if len(lis) == 0 or page >= 20: break page += 1 # 将所有数据保存到 CSV 文件中 with open('data.csv', 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerow(['标题', '评论', '浏览数', '日期', '天数', '花费', '人物', '玩法', '链接']) for data in data_list: writer.writerow(data) ``` 该代码将数据保存到名为 `data.csv` 的文件中,并在文件中包括标题、评论、浏览数、日期、天数、花费、人物、玩法和链接等信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值