矿机之家

发布时间 2023-07-12 16:06:10作者: 布都御魂
import hashlib
import random
import re
import time
from lxml import etree
import pymysql
import requests


def strip_tags(string, allowed_tags=''):
    if allowed_tags != '':
        # Get a list of all allowed tag names.
        allowed_tags = allowed_tags.split(',')
        allowed_tags_pattern = ['</?' + allowed_tag + '[^>]*>' for allowed_tag in allowed_tags]
        all_tags = re.findall(r'<[^>]+>', string, re.I)
        not_allowed_tags = []
        tmp = 0
        for tag in all_tags:
            for pattern in allowed_tags_pattern:
                rs = re.match(pattern, tag)
                if rs:
                    tmp += 1
                else:
                    tmp += 0
            if not tmp:
                not_allowed_tags.append(tag)
            tmp = 0
        for not_allowed_tag in not_allowed_tags:
            string = re.sub(re.escape(not_allowed_tag), '', string)
    else:
        # If no allowed tags, remove all.
        string = re.sub(r'<[^>]*?>', '', string)

    return string


# 上传图片到服务器
def get_our_pic(content_url):
    upload_picurl = 'https://www.china-mcc.com/index/grabfile/index.html'
    data = {
        'path': content_url
    }
    html = requests.post(url=upload_picurl, data=data).json()
    our_pic_url = 'https://www.china-mcc.com/' + html['file_url']
    return our_pic_url


dict_category = {'企业分类': '1', '产品分类': '2', '技术分类': '3', '需求分类': '4', '会议分类': '5', '活动分类': '6',
                 '资讯分类': '7', '图库分类': '8', '视频分类': '9', '企业性质': '10', '成熟度': '11', '应用情况': '12',
                 '成果类型': '13', '转换方式': '14', '矿山': '15', '冶金': '16', '材料': '199', '环保': '18',
                 '检测': '19', '其他': '105', '矿山设备': '21', '冶金设备': '22', '材料制备及加工设备': '23',
                 '环境保护设备': '24', '分析检测设备': '25', '矿山技术': '26', '冶金技术': '27',
                 '材料制备及加工技术': '28', '环境保护技术': '29', '分析检测技术': '30', '矿山需求': '31',
                 '冶金需求': '32', '材料制备及加工需求': '33', '环境保护需求': '34', '分析检测需求': '35',
                 '矿山行业': '36', '冶金行业': '37', '材料行业': '38', '环保行业': '39', '检测行业': '40',
                 '其他行业': '41', '线上活动': '42', '线下活动': '43', '技术资讯': '44', '产品资讯': '45',
                 '新闻资讯': '46', '企业宣传': '50', '图说产品': '48', '图说技术': '49', '会议视频': '51',
                 '产品视频': '52', '技术讲解': '53', '专题采访': '54', '应用案例': '55', '生产型': '56', '技术型': '57',
                 '服务型': '58', '实验室': '59', '小试': '60', '中试': '61', '形成产品': '62', '实际应用': '64',
                 '技术转让': '76', '规模化生产': '66', '未转让或应用': '67', '发明专利': '69', '新产品': '70',
                 '新装置': '71', '新材料': '72', '新工艺': '73', '其它': '74', '合作研发': '75', '技术许可': '77',
                 '技术入股': '78', '创业融资': '79', '股权融资': '80', '探矿': '175', '采矿': '176', '选矿': '177',
                 '通用': '178', '火法冶金': '179', '湿法冶金': '180', '电冶金': '181', '真空冶金': '182',
                 '功能材料': '183', '复合材料': '184', '新能源材料': '185', '合金材料': '204', '材料加工': '187',
                 '废水处理': '188', '大气治理': '189', '固/危废处置': '190', '土壤修复': '191', '物理检测': '192',
                 '化学分析': '193', '力学检测': '194', '无损检测': '195', '失效分析': '196', '环境检测': '197',
                 '探矿设备': '106', '采矿设备': '107', '选矿设备': '108', '通用设备': '109', '火法冶金设备': '110',
                 '湿法冶金设备': '111', '电冶金设备': '112', '真空冶金设备': '113', '功能材料设备': '114',
                 '复合材料设备': '115', '新能源材料设备': '116', '合金材料设备': '117', '加工设备': '118',
                 '废水处理设备': '119', '大气治理设备': '120', '固/危废处置设备': '121', '土壤修复设备': '122',
                 '物理检测设备': '123', '化学分析设备': '124', '力学检测设备': '125', '无损检测设备': '126',
                 '失效分析设备': '127', '环境检测设备': '128', '探矿技术': '129', '采矿技术': '130', '选矿技术': '131',
                 '通用技术': '132', '火法冶金技术': '133', '湿法冶金技术': '134', '电冶金技术': '135',
                 '真空冶金技术': '136', '功能材料技术': '137', '复合材料技术': '138', '新能源材料技术': '139',
                 '合金材料技术': '140', '加工技术': '141', '废水处理技术': '142', '大气治理技术': '143',
                 '固/危废处置技术': '144', '土壤修复技术': '145', '物理检测技术': '146', '化学分析技术': '147',
                 '力学检测技术': '148', '无损检测技术': '149', '失效分析技术': '150', '环境检测技术': '151',
                 '探矿需求': '152', '采矿需求': '153', '选矿需求': '154', '通用需求': '155', '火法冶金需求': '156',
                 '湿法冶金需求': '157', '电冶金需求': '158', '真空冶金需求': '159', '功能材料需求': '160',
                 '复合材料需求': '161', '新能源材料需求': '162', '合金材料需求': '163', '加工需求': '164',
                 '废水处理需求': '165', '大气治理需求': '166', '固/危废处置需求': '167', '土壤修复需求': '168',
                 '物理检测需求': '169', '化学分析需求': '170', '力学检测需求': '171', '无损检测需求': '172',
                 '失效分析需求': '173', '环境检测需求': '174', '综合': '198', '矿山材料': '200', '冶金材料': '201',
                 '环保材料': '202', '锂电设备': '203', '其它材料': '205'}

dict_area = {'北京': '32', '天津': '33', '上海': '34', '重庆': '35', '河北': '5', '山西': '6',
             '辽宁': '7',
             '吉林': '73', '黑龙江': '9', '江苏': '10', '浙江': '11', '安徽': '12', '福建': '13',
             '江西': '14',
             '山东': '15', '河南': '16', '湖北': '17', '湖南': '18', '广东': '19', '海南': '20',
             '四川': '21',
             '贵州': '22', '云南': '23', '陕西': '24', '甘肃': '25', '青海': '26', '内蒙': '27',
             '广西': '28',
             '西藏': '29', '宁夏': '30', '新疆': '31', '石家庄': '36', '唐山': '37', '秦皇岛': '38',
             '邯郸': '39',
             '邢台': '40', '保定': '41', '张家口': '42', '承德': '43', '沧州': '44', '廊坊': '45',
             '衡水': '46',
             '太原': '47', '大同': '48', '朔州': '49', '忻州': '50', '阳泉': '51', '吕梁': '52',
             '晋中': '53',
             '长治': '54', '晋城': '55', '临汾': '56', '运城': '57', '沈阳': '58', '大连': '59',
             '鞍山': '60',
             '抚顺': '61', '本溪': '62', '丹东': '63', '锦州': '64', '营口': '65', '阜新': '66',
             '辽阳': '67',
             '盘锦': '68', '铁岭': '69', '朝阳': '70', '葫芦岛': '71', '长春': '72', '四平': '74',
             '辽源': '75',
             '通化': '76', '白山': '77', '松原': '78', '白城': '79', '延边朝鲜族自治州': '80',
             '哈尔滨': '81',
             '齐齐哈尔': '82', '鸡西': '83', '鹤岗': '84', '双鸭山': '85', '大庆': '86',
             '伊春': '87', '佳木斯': '88',
             '七台河': '89', '牡丹江': '90', '黑河': '91', '绥化': '92', '大兴安岭地区': '93',
             '南京': '94',
             '无锡': '95', '徐州': '96', '常州': '97', '苏州': '98', '南通': '99', '连云港': '100',
             '淮安': '101',
             '盐城': '102', '扬州': '103', '镇江': '104', '泰州': '105', '宿迁': '106',
             '杭州': '107', '宁波': '108',
             '温州': '109', '绍兴': '110', '湖州': '111', '嘉兴': '112', '金华': '113',
             '衢州': '114', '台州': '115',
             '丽水': '116', '舟山': '117', '合肥': '118', '芜湖': '119', '蚌埠': '120',
             '淮南': '121', '马鞍山': '122',
             '淮北': '123', '铜陵': '124', '安庆': '125', '黄山': '126', '阜阳': '127',
             '宿州': '128', '滁州': '129',
             '六安': '130', '宣城': '131', '池州': '132', '亳州': '133', '福州': '134',
             '厦门': '135', '漳州': '136',
             '泉州': '137', '三明': '138', '莆田': '139', '南平': '140', '龙岩': '141',
             '宁德': '142', '南昌': '143',
             '九江': '144', '上饶': '145', '抚州': '146', '宜春': '147', '吉安': '148',
             '赣州': '149', '景德镇': '150',
             '萍乡': '151', '新余': '152', '鹰潭': '153', '济南': '154', '青岛': '155',
             '淄博': '156', '枣庄': '157',
             '东营': '158', '烟台': '159', '潍坊': '160', '济宁': '161', '泰安': '162',
             '威海': '163', '日照': '164',
             '滨州': '165', '德州': '166', '聊城': '167', '临沂': '168', '菏泽': '169',
             '郑州': '170', '开封': '171',
             '洛阳': '172', '平顶山': '173', '安阳': '174', '鹤壁': '175', '新乡': '176',
             '焦作': '177', '濮阳': '178',
             '许昌': '179', '漯河': '180', '三门峡': '181', '商丘': '182', '周口': '183',
             '驻马店': '184',
             '南阳': '185', '信阳': '186', '济源': '187', '武汉': '188', '黄石': '189',
             '十堰': '190', '宜昌': '191',
             '襄阳': '192', '鄂州': '193', '荆门': '194', '孝感': '195', '荆州': '196',
             '黄冈': '197', '咸宁': '198',
             '随州': '199', '恩施土家族苗族自治州': '200', '仙桃': '201', '潜江': '202',
             '天门': '203', '长沙': '204',
             '株洲': '205', '湘潭': '206', '衡阳': '207', '邵阳': '208', '岳阳': '209',
             '常德': '210', '张家界': '211',
             '益阳': '212', '娄底': '213', '郴州': '214', '永州': '215', '怀化': '216',
             '湘西土家族苗族自治州': '217',
             '广州': '218', '韶关': '219', '深圳': '220', '珠海': '221', '汕头': '222',
             '佛山': '223', '江门': '224',
             '湛江': '225', '茂名': '226', '肇庆': '227', '惠州': '228', '梅州': '229',
             '汕尾': '230', '河源': '231',
             '阳江': '232', '清远': '233', '东莞': '234', '中山': '235', '潮州': '236',
             '揭阳': '237', '云浮': '238',
             '海口': '239', '三亚': '240', '三沙': '241', '成都': '242', '自贡': '243',
             '攀枝花': '244', '泸州': '245',
             '德阳': '246', '绵阳': '247', '广元': '248', '遂宁': '249', '内江': '250',
             '乐山': '251', '南充': '252',
             '眉山': '253', '宜宾': '254', '广安': '255', '达州': '256', '雅安': '257',
             '巴中': '258', '资阳': '259',
             '阿坝藏族羌族自治州': '260', '甘孜藏族自治州': '261', '凉山彝族自治州': '262',
             '贵阳': '263',
             '遵义': '264', '六盘水': '265', '安顺': '266', '毕节': '267', '铜仁': '268',
             '黔东南苗族侗族自治州': '269',
             '黔南布依族苗族自治州': '270', '黔西南布依族苗族自治州': '271', '昆明': '272',
             '曲靖': '273',
             '玉溪': '274', '昭通': '275', '保山': '276', '丽江': '277', '普洱': '278',
             '临沧': '279',
             '德宏傣族景颇族自治州': '280', '怒江傈僳族自治州': '281', '迪庆藏族自治州': '282',
             '大理白族自治州': '283',
             '楚雄彝族自治州': '284', '红河哈尼族彝族自治州': '285', '文山壮族苗族自治州': '286',
             '西双版纳傣族自治州': '287', '西安': '288', '宝鸡': '289', '咸阳': '290',
             '铜川': '291', '渭南': '292',
             '延安': '293', '榆林': '294', '汉中': '295', '安康': '296', '商洛': '297',
             '兰州': '298', '嘉峪关': '299',
             '金昌': '300', '白银': '301', '天水': '302', '武威': '303', '张掖': '304',
             '平凉': '305', '酒泉': '306',
             '庆阳': '307', '定西': '308', '陇南': '309', '临夏回族自治州': '310',
             '甘南藏族自治州': '311',
             '西宁': '312', '海东': '313', '海北藏族自治州': '314', '黄南藏族自治州': '315',
             '海南藏族自治州': '316',
             '果洛藏族自治州': '317', '玉树藏族自治州': '318', '海西蒙古族藏族自治州': '319',
             '呼和浩特': '320',
             '包头': '321', '乌海': '322', '赤峰': '323', '通辽': '324', '鄂尔多斯': '325',
             '呼伦贝尔': '326',
             '巴彦淖尔': '327', '乌兰察布': '328', '兴安盟': '329', '锡林郭勒盟': '330',
             '阿拉善盟': '331',
             '南宁': '332', '柳州': '333', '桂林': '334', '梧州': '335', '北海': '336',
             '崇左': '337', '来宾': '338',
             '贺州': '339', '玉林': '340', '百色': '341', '河池': '342', '钦州': '343',
             '防城港': '344', '贵港': '345',
             '拉萨市': '346', '日喀则市': '347', '昌都市': '348', '林芝市': '349', '山南市': '350',
             '那曲市': '351',
             '阿里地区': '352', '银川': '353', '石嘴山': '354', '吴忠': '355', '固原': '356',
             '中卫': '357',
             '乌鲁木齐': '358', '克拉玛依': '359', '吐鲁番': '360', '哈密': '361',
             '阿克苏地区': '362',
             '喀什地区': '363', '和田地区': '364', '昌吉回族自治州': '365',
             '博尔塔拉蒙古自治州': '366',
             '巴音郭楞蒙古自治州': '367', '克孜勒苏柯尔克孜自治州': '368',
             '伊犁哈萨克自治州': '369', '塔城地区': '370',
             '阿勒泰地区': '371', '自治区直辖县级行政单位': '372', '东城区': '2153',
             '西城区': '374', '朝阳区': '845',
             '丰台区': '376', '石景山区': '377', '海淀区': '378', '顺义区': '379', '通州区': '1072',
             '大兴区': '381',
             '房山区': '382', '门头沟区': '383', '昌平区': '384', '平谷区': '385', '密云区': '386',
             '怀柔区': '387',
             '延庆区': '388', '和平区': '743', '河东区': '1616', '河西区': '391', '南开区': '392',
             '河北区': '393',
             '红桥区': '394', '滨海新区': '395', '东丽区': '396', '西青区': '397', '津南区': '398',
             '北辰区': '399',
             '武清区': '400', '宝坻区': '401', '宁河区': '402', '静海区': '403', '蓟州区': '404',
             '黄浦区': '405',
             '徐汇区': '406', '长宁区': '407', '静安区': '408', '普陀区': '1210', '虹口区': '410',
             '杨浦区': '411',
             '闵行区': '412', '宝山区': '957', '嘉定区': '414', '浦东新区': '415', '金山区': '416',
             '松江区': '417',
             '青浦区': '418', '奉贤区': '419', '崇明区': '420', '渝中区': '421', '万州区': '422',
             '涪陵区': '423',
             '大渡口区': '424', '江北区': '1137', '沙坪坝区': '426', '九龙坡区': '427',
             '南岸区': '428',
             '北碚区': '429', '綦江区': '430', '大足区': '431', '渝北区': '432', '巴南区': '433',
             '黔江区': '434',
             '长寿区': '435', '江津区': '436', '合川区': '437', '永川区': '438', '南川区': '439',
             '璧山区': '440',
             '铜梁区': '441', '潼南区': '442', '荣昌区': '443', '开州区': '444', '梁平区': '445',
             '武隆区': '446',
             }


# 把唯一值进行MD5加密
def get_md5(parmStr):
    # 1、参数必须是utf8
    # 2、python3所有字符都是unicode形式,已经不存在unicode关键字
    # 3、python3 str 实质上就是unicode
    if isinstance(parmStr, str):
        # 如果是unicode先转utf-8
        parmStr = parmStr.encode("utf-8")
        m = hashlib.md5()
        m.update(parmStr)
        return m.hexdigest()


# 链接mysql数据库
connect = pymysql.Connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwd='123456',
    db='zhongye',
    charset='utf8mb4'
)

keyword = '采掘机械'
pages = 1
scope = '采矿设备'
category_id = 107


def get_msg(keyword, scope, category_id, page_header, page_num):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57',
    }
    for pages in range(page_header, page_num):
        url = f'https://www.kjzj.com/search/page{pages}/?keyword={keyword}&active=2'
        html = requests.get(url=url, headers=headers).content.decode()
        tree = etree.HTML(html)
        # 标题
        title_list = tree.xpath('//a[@class="tit"]//@title')
        # 公司
        company_list = tree.xpath('//div[@class="gs"]//a//@title')
        second_list = tree.xpath('//a[@class="tit"]//@href')
        for num in range(len(second_list)):
            time.sleep(random.randint(3, 10))
            title = title_list[num]
            cursor = connect.cursor()
            sql1 = 'select title from kuangjizhijia'
            connect.ping(reconnect=True)
            cursor.execute(sql1)
            ir_md5_dec = cursor.fetchall()
            # 把需要查询的数据转变为元组
            md5 = tuple([title], )

            if md5 in ir_md5_dec:
                pass
                print('数据已存在')
            else:
                company = company_list[num]
                second_url = 'https:' + second_list[num]
                print(f'详情页链接:{second_url}')
                html_second = requests.get(second_url, headers=headers).content.decode()
                tree_second = etree.HTML(html_second)
                neirong = tree_second.xpath('//div[@class="xqbox"]')
                if len(neirong) == 0:
                    if tree_second.xpath('//div[@class="xq"]//text()') == [] or tree_second.xpath(
                            '//div[@class="xq"]//text()') == ['\r\n              ', '\r\n            ']:
                        print('纯图片,不要')
                        print('\n')
                        continue
                    else:
                        neirong = tree_second.xpath('//div[@class="xq"]')[0]
                        content = ''.join(etree.tostring(neirong, encoding='utf-8').decode())
                else:
                    if tree_second.xpath('//div[@class="xqbox"]//text()') == [] or tree_second.xpath(
                            '//div[@class="xqbox"]//text()') == ['\r\n              ', '\r\n            ']:
                        print('纯图片,不要')
                        print('\n')
                        continue
                    else:
                        neirong = tree_second.xpath('//div[@class="xqbox"]')[0]
                        content = ''.join(etree.tostring(neirong, encoding='utf-8').decode())

                content = re.sub(r'\xa0', "", content)
                content = re.sub(r'&#13;', "", content)
                content = re.sub(r'width', "", content)
                content = re.sub(r'height', "", content)
                content = re.sub(r'style="border:0px;"', "", content)
                content = re.sub(r'a href=', "", content)
                content = re.sub('\s', ' ', content)
                content = re.sub('\ue681', ' ', content)
                content = re.sub('class="lazy"', '', content)
                content = strip_tags(content, allowed_tags='br,img,hr,a').replace(
                    '\u200b', '')
                content_tree = etree.HTML(content)
                print((content))

                # 更换图片的链接
                src_src = content_tree.xpath('//img//@src')
                for src in src_src:
                    if 'http' in src:
                        print(f'替换前的内容图片:{src}')
                        our_pic = get_our_pic(src)
                        print(f'替换后的内容图片:{our_pic}')
                        content = content.replace(src, our_pic)
                    else:
                        print(f'替换前的内容图片:{src}')
                        our_pic = get_our_pic('https:' + src)
                        print(f'替换后的内容图片:{our_pic}')
                        content = content.replace(src, our_pic)
                pic_old = tree_second.xpath('//div[@class="bigbox"]//img//@src')
                if pic_old == []:
                    pic_old = tree_second.xpath('//ul[@class="list"]//li[@class="item "]/img//@src')
                pic_old = 'https:' + pic_old[0]
                print(f'原图片链接:{pic_old}')
                pic = get_our_pic(pic_old)
                print(f'转换后的图片链接:{pic}')
                tag_list = tree_second.xpath('//meta[@name="keywords"]//@content')

                tag_list = (''.join(tag_list).split(',')[:5])
                tags = ''
                for tag in tag_list:
                    tags += tag + ','
                tag = tags[:-1]
                print(f'tag:{tag},{len(tag)}')
                intro = ''.join(tree_second.xpath('//meta[@name="description"]//@content')).replace('\u200b', '')
                intro = re.sub('\s', '', intro)
                intro = re.sub('价格可谈,欢迎咨询!', '', intro)
                hit = random.randint(100, 1000)
                all = tree_second.xpath('//ul[@class="canshu clearfix"]//li//p[2]//text()')
                if all == []:
                    all = tree_second.xpath('//table[@class="table_one"]//tr[2]//th//text()')
                print(f'品牌,型号,地址:{all}')
                # 品牌
                brand = all[0]
                # 型号
                spec = all[1]
                # 地址
                city = ''.join(all[2]).strip()
                print(f'标题:{title}')
                print(f'生产企业:{company}')
                print(f'品牌:{brand}')
                print(f'型号:{spec}')
                print(f'地址:{city}')
                print(f'图片:{pic}')
                print(f'标签:{tag}')
                print(f'简介:{intro}')
                print(f'访问量:{hit}')
                print(f'应用领域:{scope}')
                print(f'应用领域ID:{category_id}')
                b = dict_area.keys()
                city_id = []
                for key in b:
                    value = dict_area[key]

                    if key in city:
                        city_id.append(value)
                city_id = city_id[-1]
                print(f'发货地ID:{city_id}')
                data_list = {
                    'title': title,
                    'company': company,
                    'brand': brand,
                    'spec': spec,
                    'pic': pic,
                    'tag': tag,
                    'intro': intro,
                    'content': content,
                    'hit': hit,
                    'city_id': city_id,
                    'scope': scope,
                    'category_id': category_id,
                    'phone': '暂无'
                }

                sql = f"""insert into kuangjizhijia{str(tuple(data_list.keys())).replace("'", "")} values {str(tuple(data_list.values()))};"""
                cursor.execute(sql)
                connect.ping(reconnect=True)
                # 提交数据库
                connect.commit()
                ir_idd = int(connect.insert_id())
                print('数据库自增id', ir_idd, '数据')

                print("kuangjizhijia表数据存储成功!", )
                print('提交成功')
                print('\n')


if __name__ == '__main__':
    # keyword = '采矿设备'
    # pages = 1
    # scope = '采矿设备'
    # category_id = 107
    # page_header=1
    # page_num=26
    # get_msg(keyword, scope, category_id, page_header, page_num)
    get_msg('采矿设备', '采矿设备', 107, 1, 26)