#!/bin/bash
curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user H78H42TCN191075P:3D1EA6E4F458AB69'
curl_str='curl -L --socks5 socks-cla.abuyun.com:8030 --proxy-user S822RB9T27K96TPC:5E68523C79E62C41'
### encode url
encode_url(){
local supplier_name_encode="$(echo "$" | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g')"
echo "https://xin.baidu.com/s?q=${supplier_name_encode}&t=0"|perl -npe 's/\n//'
} do_down_web_info_html(){
local url=$(encode_url "$1")
local html_file="$2"
# wget ${url} -O ${html_file}
#echo -e "\n===================================> " ${curl_str} "${url}" \> ${html_file}"\n"
${curl_str} "${url}" > ${html_file}
} get_supplier_pid(){
local html_file="${1}.html"
local supplier_name="$2"
do_down_web_info_html "${supplier_name}" "${html_file}"
### 获取pid
echo $(grep compinfo ${html_file}|head -|awk -F'pid=' '{print $2}'|awk -F'"' '{print $1}')
} do_down_supplier_unifiedcode(){
local id="$1"
local pid="$2"
### 获取统一社会信用代码
local unifiedCode="${id}_unifiedCode"
local api_basic_url="https://xin.baidu.com/detail/basicAjax?pid=${pid}"
echo -e "\n 获取统一社会信用代码 ===================================> "${curl_str} "${api_basic_url}" \> ${unifiedCode}"\n"
${curl_str} "${api_basic_url}" > ${unifiedCode}
} do_switch_ip(){
# ${curl_str} http://proxy.abuyun.com/switch-ip
echo "do_switch_ip"
} do_run(){
local id="$1"
local supplier_name="$2"
pid=$(get_supplier_pid "${id}" "${supplier_name}")
do_down_supplier_unifiedcode "${id}" "${pid}"
# echo -n $(date "+%F %T")" | ${id} | ${supplier_name} | ${pid} |"
### 解析json为csv文件
# jq -r '[(.data.entName|tostring),(.data.unifiedCode|tostring)]|join("|")' "${id}_unifiedCode"
} result_file="result_code"
# "上海东福网络科技有限公司广州分公司","" token(){
local pid=$
# 判断是否有传入pid
if [ -z "${pid}" ]
then
echo "please input pid"
exit
fi # 设置并发数,默认为5
local concurrency=
if [ -n "$2" ]
then
concurrency=$
echo "Concurrency: $2"
fi # 创建有名管道,如果fd1不存在则创建
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1
# 创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符999就有了有名管道文件的所有特性
# 为了让程序有一定的扩展性,不想写死fd,因而引入了变量。
# 因而引入eval命令,强制shell进行变量展开。
# eval exec "${fd}>file"简单的说,eval将右边参数整体作为一个命令,进行变量的替换,然后将替换后的输出结果给shell去执行。
eval exec "${pid}<>/tmp/fd1"
# 关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
[ -e /tmp/fd1 ] && rm -f /tmp/fd1 # 初始化并行数
for ((i=;i<=${concurrency};i++))
do
# &999代表引用文件描述符999,这条命令代表往管道里面放入了一个"令牌"
echo ${i}>&${pid}
done
} main(){
local pid=$$
local start_time=`date +%s`
# 生成管道文件
token ${pid}
local num=
cat ../tmpa|head -|tail -|while read line
do
num=$((${num}+))
if [ ${num} -eq ]
then
do_switch_ip
num=
echo "==================================== reset num ===================================="
fi
# 获取令牌
read -u${pid} name
{
local supplier_info=($(echo ${line}|sed 's/"//g'|sed 's/,/ /'))
local id="${supplier_info[1]}"
local supplier_name="${supplier_info[0]}"
echo "${id} | ${supplier_name}"
do_run ${id} ${supplier_name}
# | tee -a ${result_file}_${name}
echo ${name}>&${pid}
} &
done wait
# 定义脚本运行的结束时间
local stop_time=`date +%s`
echo "TIME:`expr ${stop_time} - ${start_time}`"
# 关闭文件描述符的读
eval exec "${pid}<&-"
# 关闭文件描述符的写
eval exec "${pid}>&-"
} main

shell爬虫的更多相关文章

  1. Linux shell爬虫实现树洞网自动回复Robot

    奇怪的赞数 人生在世,不如意事十之八九,可与言者无二三人.幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找发情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台. 我是偶然 ...

  2. shell爬虫--抓取某在线文档所有页面

    在线教程一般像流水线一样,页面有上一页下一页的按钮,因此,可以利用shell写一个爬虫读取下一页链接地址,配合wget将教程所有内容抓取. 以postgresql中文网为例.下面是实例代码 #!/bi ...

  3. shell爬虫简易脚本(线程数可控)

    1.介绍 以机电之家网站为例 经过初步分析,机电之家的数据量较大,并且数据组织规则较为统一,适合以代码方式进行全量爬取. 企业列表URL统一为http://www.jdzj.com/yp_vlist_ ...

  4. shell 爬虫 从日志分析到数据采集与分析

    [root@VM_61_158_centos ~]# curl http://ip.chinaz.com/220.112.233.179 |grep -e Whwtdhalf.*span.*span. ...

  5. shell及Python爬虫实例展示

    1.shell爬虫实例: [root@db01 ~]# vim pa.sh #!/bin/bash www_link=http://www.cnblogs.com/clsn/default.html? ...

  6. scrapy知识积累

    Scrapy 中文文档https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 创建项目 scrapy startproje ...

  7. SHELL网络爬虫实例剖析--转载

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nolinux.blog.51cto.com/4824967/1552472 前天 ...

  8. 爬虫系列3:scrapy技术进阶(xpath、rules、shell等)

    本文主要介绍与scrapy应用紧密相关的关键技术,不求很深入,但求能够提取要点.内容包括: 1.xpath选择器:选择页面中想要的内容 2.rules规则:定义爬虫要爬取的域 3.scrapy she ...

  9. Python爬虫教程-33-scrapy shell 的使用

    本篇详细介绍 scrapy shell 的使用,也介绍了使用 xpath 进行精确查找 Python爬虫教程-33-scrapy shell 的使用 scrapy shell 的使用 条件:我们需要先 ...

随机推荐

  1. vim Tab的设置问题

    VIM 中处理 TAB 异常的方便. 键盘上的 TAB 键,与文件中的 TAB 符号一定要区分开,这是两个概念. 显示当前文件中的 Tab /\t 实际上,就是查询 \t 符号. shiftwidth ...

  2. win8 装的SQL Server2012 企业版

    链接:ed2k://|file|cn_sql_server_2012_enterprise_edition_x86_x64_dvd_813295.iso|5054384128|BC78EFDC4005 ...

  3. JS---案例:高清放大镜

    案例:高清放大镜 分3步 1. 鼠标进入和离开,显示和隐藏遮挡层和大图div 2. 鼠标在小层上移动,鼠标横纵坐标,为可视区域坐标-遮挡层的宽高,鼠标移动的时候,在一个区域内移动,需要判断和定义下移动 ...

  4. LUOGU 2593 : [Zjoi2006] 超级麻将

    传送门 解题思路 直接爆搜全T..状态数太多了,所以我们考虑贪心+剪枝.贪心:先拿三个连着的,再拿四个一样的,再拿三个一样的,最后拿两个一样的这样的搜索顺序最优,两个的放最后是因为只要这样的一个,三个 ...

  5. Laravel 安装登录模块

    cmd打开项目目录,执行如下代码即可 php artisan make:auth url访问

  6. laravel-- 在laravel操作redis数据库的数据类型(string、哈希、无序集合、list链表、有序集合)

    安装redis和连接redis数据库 在controller头部引入 一.基本使用 public function RedisdDbOne() { // 清空Redis数据库 Redis::flush ...

  7. 关于background-image调整大小和位置的方法笔记

    遇到background-image的问题有点多,直接上网搜资料自己整理一下 <!DOCTYPE html> <html lang="en"> <he ...

  8. 001. 注释过的boot.s

    从网上搜罗一个很详细注释的boot.s版本,加了小小一点点自己的理解,不太多. 用 as86, ld86 可以编译,   ubuntu下可以通过 apt install bin86 来安装好像. ; ...

  9. jquery购物评分

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 【JZOJ5088】【GDOI2017第四轮模拟day2】最小边权和 排序+动态规划

    题面 有一张n个点m条边的有向图,每条边有一个互不相同的边权w,有q个询问,要求你从点a经过不超过c条边到点b,要求经过的边权递增并和尽量小,求出最小的边权和,如果没有合法方案则输出-1. 对于100 ...