python3爬虫踩坑记纪录篇(二)

1首先这两天遇到线程锁的问题不涉及锁机制,只改代码
线程锁的时候一定要锁上全局变量,局部变量或没锁的情况都会造成程序重复

同时lock.acquire(),lock.release()可以使用with lock,前提是实例化threading,还有就是锁得代码越关键越好而不是越多越好

mutex=threading.Lock()

改写后方案:

with mutex:
    for i in range(1000000): #锁定期间,其他线程不可以干活
        num+=1

原方案:当然锁住的变量一定是全局变量,局部变量的话就会使线程读的时候该参数会出现多次读取同一个值

if mutex.acquire(1):#锁住成功继续干活,没有锁住成功就一直等待,1代表独占
    for i in range(1000000): #锁定期间,其他线程不可以干活
        num+=1
        mutex.release() #释放锁

2列表推导式的问题:两种方式含义不同具体请百度,但都涉及一个问题,由于循环是无止境的(某种意义上将),那么这个时候要想从循环中去查一个条件是没有意义的,类似与下面,必须在给定if条件下方break,否则就是不断被循环中下一个值覆盖的不到你想要的值,当然列表推导式不支持break。
另外continue是跳过一次循环,也就是你可以剔除循环中你不要的值,方法很多具体实现看个人。

第一种方式:

[m for m in image_list if (str(id) + "_0") in m]

第二种方式

[m if (str(id) + "_0") in m  else image_list[0] for m in image_list]

3文件操作:一个简单的转移文件希望能帮到你

    name = os.path.basename(paths)  # 获取文件名
    dirname = os.path.dirname(paths)  # 获取文件目录
    full_path = os.path.join(dirname, name)合并路径
    shutil.move(full_path,path)##转移文件到目标文件夹,shutil要导包

4代理简单实现:其实诸如代理池也是可以的但是免费的代理不论你怎么去分级别处理基本不太好使。此处推荐阿布云代理实测稳定,每次请求一个代理,不过会有重复的,我此处并未去重。

# proxyHost = "*****"
    proxyPort = "*****"
    # 代理隧道验证信息注册就会有的
    proxyUser = "*******"
    proxyPass = "*******"
    proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
        "host" : proxyHost,
        "port" : proxyPort,
        "user" : proxyUser,
        "pass" : proxyPass,
    }
    proxy={
        "http"  : proxyMeta,
        "https" : proxyMeta,
    }
    ##这些是手机的ua
    useragent=[
        "Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.8.0 Mobile/14G60 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1",
        "Mozilla/5.0 (Linux; Android 7.0; STF-AL10 Build/HUAWEISTF-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/4G WebP/0.3.0 Pixel/1080",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.18 NetType/WIFI Language/en",
        "Mozilla/5.0 (Linux; Android 5.1.1; vivo Xplay5A Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1.1)",
        "Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; STF-AL00 Build/HUAWEISTF-AL00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.9 Mobile Safari/537.36",
        "Mozilla/5.0 (Linux; Android 6.0; LEX626 Build/HEXCNFN5902606111S) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/35.0.1916.138 Mobile Safari/537.36 T7/7.4 baiduboxapp/8.3.1 (Baidu; P1 6.0)",
        "Mozilla/5.0 (iPhone 92; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.7.2 Mobile/14F89 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1",
        "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; ZUK Z2121 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.8.952 Mobile Safari/537.36",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 MicroMessenger/6.5.17 NetType/WIFI Language/zh_HK",
        "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; SM-C7000 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.2.948 Mobile Safari/537.36",
        "MQQBrowser/5.3/Mozilla/5.0 (Linux; Android 6.0; TCL 580 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Mobile Safari/537.36",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 MicroMessenger/6.5.16 NetType/WIFI Language/zh_CN",
        "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3",
        "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9550 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
        "Mozilla/5.0 (Linux; Android 5.1; m3 note Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1)",
    ]
    headers = {
        "User-Agent": random.choice(useragent),
        'Connection': 'close'#####使用代理的时候可能会报错所以这里需要设置为什么百度
    }
    res=requests.get("https://www.百度.com/?",headers=headers,proxies=proxy)

还有就是之前有个面试官惊讶的问我代理不好用被绊了怎么能重连,我只想说你去惊讶吧。
*说个最简单的吧,在请求的地方加一个while true: 循环中加一个try except。请求之后判断返回状态码if
status_code == 200 ,来截取不成功的,成功就break,在200开外的continue(要处理的话自己动脑子,不过不建议,毕竟你使用了代理在重新跑一边未成功的URL就好了),报错了直接continue(相当于换了一个ip,当然如果IP太差就不要这么做了)*

5计算地图上两地之间距离,不是直线距离,是经纬度差异,比较小众有需求就用吧

    def calcu_location(self, location_x, location_y, r=0.1):
        lat_range = 180 / math.pi * r / 6372.797  # 里面的 1 就代表搜索 1km 之内,单位km
        long_r = lat_range / math.cos(location_x * math.pi / 180)
        max_lat = location_x + lat_range  # 最大纬度
        min_lat = location_x - lat_range  # 最小纬度
        max_long = location_y + long_r  # 最大经度
        min_long = location_y - long_r  # 最小经度
        range_xy = {}
        range_xy['location_x'] = {'min': min_lat, 'max': max_lat}
        range_xy['location_y'] = {'min': min_long, 'max': max_long}
        return range_xy
    l = calcu_location(float(x), float(y))###传入的经纬度
    # 下面了是对经纬度进行取小数点位数,转类型最后方便比较,当然写法啰嗦了点
    x_max=float(str(l['location_x']['max'])[0:7])
    x_min =float(str(l['location_x']['min'])[0:7])
    y_max = float(str(l['location_y']['max'])[0:8])
    y_min =float(str(l['location_y']['min'])[0:8])

6分词对比,此处我用的是最懒最简单的包difflib,当然python还有jieba这个听说不错,此处仅为偷懒
difflib.SequenceMatcher(None,x,y).ratio()返回0到一之间的两个词相似度的数字

好了东西有点少但是真的是因为懒

你可能感兴趣的:(笔记,python,文件操作,爬虫代理,地图计算距离,中文分词)