众所周知,写爬虫都是用的python 或者 java 或者 scala ,然而作为菜逼的我,当然也会随波逐流?NONONO,常在河边走,哪能不湿鞋?对不起,我穿的雨靴!老子八块五买的一双!

    使用js网络爬虫下载图片或者任何带有下载链接的内容时,能下载文件的原理:本质上来说,没有使用原生javascript进行网络爬虫下载数据的,一般使用的时js对html结构的提取的高效性作为爬虫时的优势,相比于python爬虫而言,其js爬虫对数据解析能力较弱,其数据处理的类库也没有python丰富(毕竟python作为公认的专业的数据处理语言),通常情况下,使用python爬虫进行下载文件时,只需要在html中解析出我们需要的对应的下载链接即可利用:

    1. download_url = 'xxxxxxx' # 假设这是我们通过某些手段解析出来的下载链接
    2. request = requests.get(download_url);
    3. with open(filename, 'wb') as file:
    4. file.write(request.content);

    大致按照上述的代码就能实现文件的下载,图片或者文件都行。大致的原理是使用IO流的方式,将流存储到本地中,保存方式为 wb

    使用js下载文件的代码演示:

    1. download_url = 'xxxx'
    2. let a = document.createElement('a');
    3. a.id = 'xx' // 自定义的id
    4. a.href = download_url // 下载链接
    5. a.download = 'xxx' // 自定义即可
    6. a.click()

    利用js爬虫下载文件的原理是使用a标签的download属性,如果为a标签设置了download属性,出发a标签的点击事件就会下载a标签的href中的下载地址。
    所以我们要做的就是设置虚拟dom,然后为设置的dom设置我们需要的属性,点击a即可。

    建议将最后的下载地址存储到一个数组中,在程序的最后循环点击对应的虚拟dom下载即可,要注意的是生成的dom是需要设置标志性的id或者class,以便于在循环中以此取出对应的dom执行click从而实现对应的文件的下载,执行循环的时候最好设置一个timeout,如何在循环中套用timeout而不影响程序的同步执行?使用:

    1. let i = 0;
    2. interval = setInterval(() => {
    3. if (i < download_.length) {
    4. document.getElementById(download_[i]).click();
    5. i ++ ;
    6. } else {
    7. clearInterval(interval);
    8. }
    9. }, 500);

    替代for循环的作用,便于理解,同步执行。

    整体代码:

    1. let pageTotalNum = prompt('请输入要爬取的页数:');
    2. let pageList = new Array(45).fill(0);
    3. let linkList = [];
    4. let download_ = [];
    5. pageList.forEach((item, index) => {
    6. pageList[index] = index + 1;
    7. });
    8. pageList.forEach((pageNum) => {
    9. if (pageNum == 1) {
    10. linkList.push('https://sc.chinaz.com/jianli/fengmian.html');
    11. } else {
    12. linkList.push('https://sc.chinaz.com/jianli/fengmian_' + pageNum + '.html');
    13. }
    14. });
    15. get_html = function(url) {
    16. let http = new XMLHttpRequest();
    17. http.open('get', url, false);
    18. http.send();
    19. return http.response;
    20. }
    21. parse_html = function(reg_str, html) {
    22. let reg = reg_str;
    23. let result;
    24. let second_url = [];
    25. while ((result = reg.exec(html)) !== null) {
    26. second_url.push(result[1]);
    27. }
    28. return second_url;
    29. }
    30. function main() {
    31. for (let url of linkList) {
    32. let reg_1 = /<div class="box col3 ws_block" style="width:219px.*?">.*?<a target="_blank" href="(.*?)">/igs;
    33. let html_1 = get_html(url);
    34. let url_2 = parse_html(reg_1, html_1);
    35. for (let item of url_2) {
    36. let new_url = 'https:' + item;
    37. download_url = parse_html(/<li><a href='(.*?)'/igs, get_html(new_url));
    38. let set = new Set(download_url);
    39. for (let d_url of set) {
    40. let a_node = document.createElement('a');
    41. a_node.id = d_url;
    42. document.body.appendChild(a_node);
    43. a_node.href = d_url;
    44. a_node.download = d_url;
    45. download_.push(d_url);
    46. }
    47. }
    48. }
    49. }
    50. main();
    51. let i = 0;
    52. interval = setInterval(() => {
    53. if (i < download_.length) {
    54. document.getElementById(download_[i]).click();
    55. i ++ ;
    56. } else {
    57. clearInterval(interval);
    58. }
    59. }, 500);